Subsets

原题链接Subsets

给定一个数组序列,找出所有子序列

深度优先扫一遍:)

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> res;vector<int> cur;dfs(0, nums, cur, res);return res;}
private:void dfs(int i, vector<int>& nums, vector<int>& cur, vector<vector<int>>& res){res.emplace_back(cur);if(i >= nums.size())return;for(int j = i; j < nums.size(); ++j){cur.push_back(nums[j]);dfs(j + 1, nums, cur, res);cur.pop_back();}}
};

原题链接Subsets II


找到给定序列的所有子序列,给定的序列中可能会包含重复元素

解题时需要注意几个地方

  • 容我好好吐槽一下,根本没有说明好伐:(
  • 最后的结果中子序列的顺序无要求,即[1,2,3]和[3,2,1]是相同的
  • 对于重复元素,第二条规定尤为重要,即[4,4,4,1]和[4,4,1,4]是相同的
  • 更重要的是,对于第三条,[1,4,4,4]和[4,4,4,1]以及[4,4,1,4]同样是相同的

用[1,2,3]代替[3,2,1]以及用[1,4,4,4]代替[4,4,1,4]是什么概念,就是说所有子序列可以都是递增的,再往上想就是可以事先对给定序列排序,那解决重复问题就简单多了

在Subsets中,通过深度优先找到了所有的子序列,但是如果序列中有重复元素,需要添加几个限制条件

以序列[4,4,4,1,4]举例,如果不添加限制条件,那么最后的结果可能存在

[4,4,4,1],[4,4,1,4]以及[4,1],[1,4]以及[4,4,4],[4,4,4]

毫无疑问上面二个都是相同的,即结果中出现重复元素,不符合要求

深度优先和回溯在解决重复问题时通常是在下次递归之前判断当前要添加到结果集中的元素是否应该被添加到结果集中,针对Subsets的模板


class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {//std::sort(nums.begin(), nums.end());vector<vector<int>> res;vector<int> cur;dfs(nums, 0, cur, res);return res;}
private:void dfs(vector<int>& nums, int i, vector<int>& cur, vector<vector<int>>& res){res.emplace_back(cur);for(int j = i; j != nums.size(); ++j){//判断是否应该添加到结果集中if(...){cur.emplace_back(nums[j]);dfs(nums, j + 1, cur, res);cur.pop_back();        }}}
};

方法就是判断nums[j]是否在[i : j-1]这个范围内出现过,考虑当前遍历到[1,4,4,4,4] (已排序)的下标1(即元素4的位置),在回溯之后遍历的下标改为2(即第二个元素4的位置),这就会重复

因为在遍历第一个4时进入深度优先递归,在递归的过程中已经将所有组合可能都记录到结果中,其中就包括下标组合[1,3,4],那和第二次递归的下标组合[2,3,4]其实是一样的,结果都是[4,4,4]

原因是对于任何重复的元素,只需要考虑第一个即可,假设i, i+1, i+2, …, k是重复元素,那么选择nums[i]和选择nums[i+2]是一样的,因为选择nums[i]时,可以假设递归时不选择nums[i+1],那么就和直接选择nums[i+2]一样了

代码如下


class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {std::sort(nums.begin(), nums.end());vector<vector<int>> res;vector<int> cur;dfs(nums, 0, cur, res);return res;}
private:void dfs(vector<int>& nums, int i, vector<int>& cur, vector<vector<int>>& res){res.emplace_back(cur);for(int j = i; j != nums.size(); ++j){if(j == i || nums[j] != nums[j - 1]){cur.emplace_back(nums[j]);dfs(nums, j + 1, cur, res);cur.pop_back();}}}
};

每天一道LeetCode-----找出给定序列的所有子序列相关推荐

  1. 找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

  2. python counter 出现次数最少的元素_[PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法...

    问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 c ...

  3. 两数之和:找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标

    找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标. (本文获得CSDN质量评分[90]) [学习的细节是欢悦的历程] Python 官网:https://www.python.org/ ...

  4. 『力扣刷题』5238_找出给定方程的正整数解 解题代码

    html: embed_local_images: true embed_svg: true offline: true toc: undefined print_background: false ...

  5. 34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标

    34. 在排序数组中查找元素的第一个和最后一个位置 难度中等2012 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target.请你找出给定目标值在数组中的开始位置和结束位置. 如果 ...

  6. LC-1237. 找出给定方程的正整数解(相向双指针)

    1237. 找出给定方程的正整数解 难度中等73 给你一个函数 f(x, y) 和一个目标结果 z,函数公式未知,请你计算方程 f(x,y) == z 所有可能的正整数 数对 x 和 y.满足条件的结 ...

  7. C++leetcode找出两个有序数组的中位数(2)

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 如果不考虑复杂度的话这个题目很简单:将两 ...

  8. LeetCode 1673. 找出最具竞争力的子序列(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具 竞争力 的 nums 子序列. 数组的子序列是从数组中删除一些元素(可能不删除元素 ...

  9. 找出最具竞争力的子序列_力扣300——最长上升子序列

    这道题主要涉及动态规划,优化时可以考虑贪心算法和二分查找. 原题 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18]输出: 4 解释: ...

最新文章

  1. linux 进程等待 wait 、 waitpid
  2. 区域显示触发_Unity3D 在Hierarchy窗口中显示物体所属Layer
  3. hdfs数据节点分发什么协议_分布式文件系统HDFS解析
  4. Spring Cloud教程–使用Spring Cloud Bus自动刷新配置更改
  5. Windows7睡眠后自动唤醒
  6. ActiveReports 报表控件官方中文新手教程 (1)-安装、激活以及产品资源
  7. ZZULIOJ 1064:加密字符
  8. Apache PLC4X开发者向企业下最后通牒:如不提供资助将停止支持
  9. linux crontab 实现每秒执行
  10. kotlin_Kotlin
  11. 纯JS日历控件自动输入日期到TextBox、文本框当中
  12. mavros常用消息类型表
  13. 5.携程架构实践 --- 框架中间件
  14. 佳能430二代_简单好用 佳能430EX III-RT闪光灯评测
  15. 百度地图定位API+和风天气城市搜索API构成的天气定位模块
  16. Longest Palindrome
  17. 计算机flash操作,会考计算机word、Excel、Photoshop、Flash的操作方法(之二)
  18. PC版微信  网络不可用,请检查你的网络设置 的解决方法
  19. CISCO ANYCONNECT 一直连接不上,打开点击连接就闪退 或 卡在“Hostscan mission complete” or “Hostscan state idle“
  20. Docker笔记-04 仓库

热门文章

  1. 怎么用cmd关闭系统弹窗_C盘空间越来越小怎么办?5招帮你解决问题!
  2. python中dataframe合并列名日期到季度_python 处理dataframe中的时间字段方法
  3. Java黑皮书课后题第6章:**6.3(回文整数)使用下面的方法头编写两个方法:……使用reverse方法实现isPalindrome。如果一个数字的逆序数和它自身相等,这个数就称为回文数。
  4. php url无效,PHP解析URL并失去URL中的参数
  5. Kruscal算法+并查集 求解最小生成树
  6. iframe有那些缺点
  7. Study 4 —— 数据类型(1)
  8. 老李分享:Android -自动化埋点 2
  9. Linux系统管理技术手册——第6章 添加新用户
  10. MemoryStream 反序列化的报错问题