leetcode 90. 子集 II 思考分析
与本题相关联的题目解析:
leetcode 78. 子集 思考分析
leetcode 40. 组合总和 II思考分析
题目
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
思考
在文章 leetcode 40. 组合总和 II思考分析
我们讲过去重的方法,分为树层去重和树枝去重。
首先根据例子画出解空间树草图:观察
发现,同一层重复取2就要过滤掉,同个树枝上是可以重复取相同元素的。这样就确定了去重条件,在层遍历的for循环中加入:
//如果遇到同一个集合的重复元素,跳过这个元素即可
if(i > startindex && candidates[i] == candidates[i-1]) continue;
在调用函数前要先对数组进行排序,使得重复的元素靠在一起,加速剪枝。
//排序加速剪枝
sort(candidates.begin(),candidates.end());
其余的思路和之前的leetcode 78. 子集 思考分析一样。
代码
class Solution {public:vector<vector<int>> result;vector<int> res;int floor=0;void backtracking(vector<int>& nums,int start,int end){result.push_back(res);//剩余集合为空,返回if(start==end){return;}for(int i=start;i<end;i++){if(i > start && nums[i] == nums[i-1]) continue;//cout<<nums[i]<<"层数:"<<floor<<endl;//处理结点;res.push_back(nums[i]);floor++;//递归,探索下一层backtracking(nums,i+1,end); //递归floor--;//回溯,撤销处理结果res.pop_back();}return;}vector<vector<int>> subsetsWithDup(vector<int>& nums) {result.clear();res.clear();floor=0;//排序加速剪枝sort(nums.begin(),nums.end());backtracking(nums,0,nums.size());return result; }
};
leetcode 90. 子集 II 思考分析相关推荐
- LeetCode 90.子集 II 中等难度
90. 子集 II 题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例:输入: [1,2,2] 输出: [[2],[1],[ ...
- leetcode 47. 全排列 II 思考分析
题目 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 思考分析以及代码 这一题和前面的做过的两个题目有所关联: leetcode 46. 全排列 思考分析 再加上lee ...
- LeetCode 90. 子集 II【数组,回溯算法,排序去重】
90. 子集 II 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.返回的解集中,子集可以按 任意顺序 排列. 示例 1: 输入 ...
- LeetCode 90. 子集 II(回溯+剪枝)
文章目录 1. 题目信息 2. 解题 2.1 循环 2.2 回溯 1. 题目信息 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例 ...
- Leetcode 90. 子集 II 解题思路及C++实现
解题思路: 经典的深度优先搜索问题. 这里,根据子集的元素个数 i ,分别进行 dfs .因为 nums 数组中有重复元素,所以在 dfs 程序中,需要有一个去重的判断. 判断逻辑为:当前元素与上一个 ...
- leetcode 90. 子集 II(回溯算法)
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.返回的解集中,子集可以按 任意顺序 排列. 示例 1: 输入:nums = [1 ...
- [leetcode]90. 子集 II
bitmasking: 歪打正着,想着跟子集1(没有重复的元素)差不多,去下重就好了,然后没排序,然后就出现了重复的子集,然后排下序观察输出,然后就好了???,然后发现没排序重复是因为有的子集包含的元 ...
- leetcode 491. 递增子序列 思考分析
题目 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 说明: 给定数组的长度不会超过15. 数组中的整数范围是 [-100,100]. 给定数组中可能包含重复数字 ...
- leetcode 122. 买卖股票的最佳时机 II 思考分析
目录 题目 贪心法 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时 ...
最新文章
- Ricky’s RealDan’s Ricky
- 常用的rpm和yum的一些命令
- 自适应阈值化操作:adaptiveThreshold()函数
- Oracle中执行存储过程call和exec区别
- 计算机科学竞赛加拿大,滑铁卢大学计算机科学与数学竞赛最新考试时间!
- 通过fork进程爆破canary
- listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示
- 数字图像处理基础知识总结
- PCL Lesson1 :PCL库PCLVisualizer的简单使用
- vb子程序未定义怎么改怎么办_vb中总提示子程序或函数未定义
- 基于javaSwing、MySQL的酒店客房管理系统(附源码)
- 分享一个Qt的pdf查看器
- 程序人生|毕业一年有感
- splunk篇5-导出csv文件中文乱码
- 商务英语:外企工作邮件常用100句
- JavaSE学习笔记 - 基础(1)
- 汽车标准:全球EMC试验标准汇总。
- 浅谈电机,如何选择步进电机的型号?
- 密码学-->buuctf 1~12
- 如何辨别该公司是不是培训机构的技巧
热门文章
- 【TypeScript系列教程05】保留关键字
- 轩逸车联网功能怎么用_北斗已建设完成,那“北斗导航”怎么用?“短报文功能”怎么用?...
- linux 命令 抛后台,Linux 后台执行命令
- java freemarker 分页_10小时入门java开发04 springboot+freemarker+bootstrap快速实现分页功能...
- android 自定义弹窗diss,Android中自定义PopupWindow,动态弹窗。
- Npm install failed with “cannot run in wd”
- web3.js_1.x.x--API(一)event/Constant/deploy/options
- nginx的ngx_http_realip_module模块和http头X-Forwarded-For、X-Real-IP
- 有一本书,适合零到十年经验的程序员看
- 设计模式(二)模板方法模式