当前位置: 首页 > news >正文

Follow Carl To Grow|【LeetCode】93.复原IP地址,78.子集,90.子集II

【LeetCode】93.复原IP地址

题意:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

思路:用回溯的思路,依次判断在哪里插入点号,有3个点即出口。检查切分出的区间内,是0xx、xxxx、大于255小于0、有非数字符号直接退出。

代码:

class Solution {
public:vector<string> m_res;// s[left, right]bool isValid(string s, int left, int right){if (left > right || right - left > 3){return false;}if ('0' == s[left] && left != right){return false;}int num = 0;for (int i = left; i <= right; ++i){if (!isdigit(s[i])){return false;}num = num * 10 + s[i] - '0';if (0 > num || 255 < num){return false;}}return true;}void backtracking(string s, int idx, int point){if (3 == point){if (isValid(s, idx, s.size() - 1)){m_res.push_back(s);}return;}for (int i = idx; i < s.size(); ++i){if (isValid(s, idx, i)){s.insert(s.begin() + i + 1, '.');++point;backtracking(s, i + 2, point);--point;s.erase(s.begin() + i + 1);}}}vector<string> restoreIpAddresses(string s) {backtracking(s, 0, 0);return m_res;}
};

【LeetCode】 78.子集

题意:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

思路:构建出多叉树,回溯收集每一个结点的值。

代码:

class Solution {
public:vector<int> m_path;vector<vector<int> > m_res;void backtracking(vector<int>& nums, int idx){// 收集子集m_res.push_back(m_path);for (int i = idx; i < nums.size(); ++i){m_path.push_back(nums[i]);backtracking(nums, i + 1);m_path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums, 0);return m_res;}
};

【LeetCode】90.子集II

题意:给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

思路:先对数组排序,然后回溯时利用used数组。如果当前值和前一个相同并且前一个没被选过,说明是回溯的结果,同一树层跑过,应该跳过。

代码:

class Solution {
public:vector<int> m_path;vector<vector<int>> m_res;void backtracking(vector<int>& nums, int idx, vector<bool> &used){m_res.push_back(m_path);for (int i = idx; i < nums.size(); ++i){if (0 < i && nums[i - 1] == nums[i] && !used[i - 1]){continue;}else{m_path.push_back(nums[i]);used[i] = true;backtracking(nums, i + 1, used);used[i] = false;m_path.pop_back();}}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {// 去重需要排序,让相同的先待在一起sort(nums.begin(), nums.end());vector<bool> used(nums.size(), false);backtracking(nums, 0, used);return m_res;}
};

心态:“第七章 回溯算法part03” 拿下!
参考资料

相关文章:

  • 小红书多账号管理平台哪个好用?可以快速监测多个小红书账号的数据吗?
  • Python 提取图片主色调
  • Canvas 指纹:它是什么以及如何绕过它
  • 聊聊etsy平台,一个年入百万的项目
  • 在编译 PHP 8.3.8 时遇到 configure: error: Package requirements (libxml-2.0 >= 2.9.0)
  • Linux-笔记 全志T113移植正点4.3寸RGB屏幕笔记
  • Spring之事务失效的场景
  • 【推荐】Prometheus+Grafana企业级监控预警实战
  • uniapp微信小程序使用xr加载模型
  • 代谢组数据分析十一:典型相关分析
  • golang使用RSA加密和解密
  • Nosql期末复习
  • 机器人----四元素
  • Cocos制作抖音小游戏接入侧边栏复访接口实例
  • 6.29学习笔记
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【前端学习】-粗谈选择器
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Android 架构优化~MVP 架构改造
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CSS 专业技巧
  • JAVA之继承和多态
  • spring + angular 实现导出excel
  • Theano - 导数
  • 包装类对象
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 反思总结然后整装待发
  • 关于springcloud Gateway中的限流
  • 讲清楚之javascript作用域
  • 力扣(LeetCode)357
  • 前端学习笔记之观察者模式
  • 巧用 TypeScript (一)
  • 软件开发学习的5大技巧,你知道吗?
  • 山寨一个 Promise
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​学习一下,什么是预包装食品?​
  • #每日一题合集#牛客JZ23-JZ33
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (30)数组元素和与数字和的绝对差
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)构建dubbo分布式平台-平台功能导图
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (含笔试题)深度解析数据在内存中的存储
  • (函数)颠倒字符串顺序(C语言)
  • (简单) HDU 2612 Find a way,BFS。
  • (接口封装)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (算法)求1到1亿间的质数或素数
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)认识微服务
  • (转) 深度模型优化性能 调参
  • (转)重识new