leetcode 78. Subsets 、90. Subsets II
第一题是输入数组的数值不相同,第二题是输入数组的数值有相同的值,第二题在第一题的基础上需要过滤掉那些相同的数值。
level代表的是需要进行选择的数值的位置。
78. Subsets
错误解法:
- class Solution {
- public:
- vector<vector<int>> subsets(vector<int>& nums) {
- vector<vector<int> > result;
- if(nums.empty())
- return result;
- vector<int> res;
- int level = ;
- subsets(nums,result,res,level);
- return result;
- }
- void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
- result.push_back(res);
- for(int i = level;i < nums.size();i++){
- res.push_back(nums[i]);
- subsets(nums,result,res,level+);
- res.pop_back();
- }
- return;
- }
- };
如果只看代码本身,不看继续的递归,整个for循环执行完成是同一层的所有节点。
level是同一层初始的开始,对于同一层来说是一个固定值。
正确解法:
时间复杂度2的n次方*n
- class Solution {
- public:
- vector<vector<int>> subsets(vector<int>& nums) {
- vector<vector<int> > result;
- if(nums.empty())
- return result;
- vector<int> res;
- int level = ;
- subsets(nums,result,res,level);
- return result;
- }
- void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
- result.push_back(res);
- for(int i = level;i < nums.size();i++){
- res.push_back(nums[i]);
- subsets(nums,result,res,i+);
- res.pop_back();
- }
- return;
- }
- };
错误解法:
如果是[1,2,3]这个数组,输出的结果不会包含任何一个含有3的子数组
subset的题目必须将每个搜索的节点存储,这个代码每次是在下一个迭代中(即i+1)将上一次的结果进行存储,所以当level=2时把3存入res时,只有在level = 3时才会将这个搜索存入result。
修改的办法要么是直接删除if判断,要么是在if判断中加入result.push_back(res);
- class Solution {
- public:
- vector<vector<int>> subsets(vector<int>& nums) {
- vector<vector<int>> result;
- if(nums.empty())
- return result;
- vector<int> res;
- int level = ;
- subsets(nums,result,res,level);
- return result;
- }
- void subsets(vector<int> nums,vector<vector<int>>& result,vector<int> res,int level){
- if(level == nums.size()){
- return;
- }
- result.push_back(res);
- for(int i = level;i < nums.size();i++){
- res.push_back(nums[i]);
- subsets(nums,result,res,i+);
- res.pop_back();
- }
- }
- };
90. Subsets II
先用sort排序,是为了利用相同数值紧邻。
在整个过程中,在回溯回来的过程中,才会考虑相同的数值跳过。
从搜索树来看,实际上只在同一层进行相同数值判断,而每一层的节点都是通过回溯得到的。错误的解法是在每一个节点都进行判断。
错误解法:
- class Solution {
- public:
- vector<vector<int>> subsetsWithDup(vector<int>& nums) {
- vector<vector<int> > result;
- if(nums.empty())
- return result;
- vector<int> res;
- int level;
- sort(nums.begin(),nums.end());
- subsets(nums,result,res,level);
- return result;
- }
- void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
- result.push_back(res);
- for(int i = level;i < nums.size();i++){
- if(i > && nums[i] == nums[i-])
- continue;
- res.push_back(nums[i]);
- subsets(nums,result,res,i+);
- res.pop_back();
- }
- return;
- }
- };
正确解法:
- class Solution {
- public:
- vector<vector<int>> subsetsWithDup(vector<int>& nums) {
- vector<vector<int> > result;
- if(nums.empty())
- return result;
- vector<int> res;
- int level = ;
- sort(nums.begin(),nums.end());
- subsets(nums,result,res,level);
- return result;
- }
- void subsets(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,int level){
- result.push_back(res);
- for(int i = level;i < nums.size();i++){
- res.push_back(nums[i]);
- subsets(nums,result,res,i+);
- res.pop_back();
- while(i < nums.size() - && nums[i+] == nums[i])
- i++;
- }
- return;
- }
- };
leetcode 78. Subsets 、90. Subsets II的更多相关文章
- 78. Subsets(M) & 90. Subsets II(M) & 131. Palindrome Partitioning
78. Subsets Given a set of distinct integers, nums, return all possible subsets. Note: The solution ...
- leetcode 51. N-Queens 、52. N-Queens II
51. N-Queens 使用isValid判断当前的位置是否合法 每次遍历一行,使用queenCol记录之前行的存储位置,一方面是用于判断合法,另一方面可以根据存储结果输出最终的结果 class S ...
- Leetcode之回溯法专题-90. 子集 II(Subsets II)
Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...
- [LeetCode] 90.Subsets II tag: backtracking
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...
- [leetcode]90. Subsets II数组子集(有重)
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...
- [LeetCode] 90. Subsets II 子集合 II
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...
- LeetCode Problem 90. Subsets II
python solution 123456789101112131415161718192021222324252627 class (object): def subsetsWithDup(sel ...
- 【LeetCode】90.Subsets II
Subsets II Given a collection of integers that might contain duplicates, nums, return all possible s ...
- LeetCode 78. 子集(Subsets) 34
78. 子集 78. Subsets 题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: 解集不能包含重复的子集. 每日一算法2019/6/6Day 34L ...
随机推荐
- PHP读取配置文件连接MySQL数据库
读取配置文件方法parse_ini_file($filepath [,$section]) 代码: conn.php <?php //连接数据库 //$conn =new mysqli('loc ...
- Halcon学习笔记——条形码的定位与识别
一维码的原理与结构 条码基本原理是利用条纹和间隔或宽窄条纹(间隔)构成二进制的”0“和”1“,反映的是某种信息. 一维条码数据结构,分四个区域.组成分别为静区.起始/终止符.校验符.数据符. 一维条码 ...
- 流畅的python和cookbook学习笔记(八)
1.函数的默认参数必须不可变 如果函数的默认参数为可变的对象,那么默认参数在函数外被修改也会影响到函数本身的. >>> def spam(a, b=None): # b要为不可变参数 ...
- 解决maven项目中,缺少 maven dependencies
因为项目需要将普通项目转换为maven项目,在右键 ’项目‘configure 后,添加maven后,发现缺少 maven dependencies,于是从网上找了一些处理措施,大体上是在.class ...
- JavaScript中解决多浏览器兼容性问题的方案
一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...
- UNION ALL 视图 'ImprotHIS2012.dbo.ImportHISData' 不可更新,因为没有找到分区依据列。 Severity 16 State 12
-- 3 更正措施,使约束check一次 Alter Table ImprotHIS_Bak_2011.dbo.ImportHISData with check Check Constraint al ...
- Effective C++ .17 函数调用时的资源管理
以书上的代码为例 processWidget(shared_ptr<Widget>(new Widget), priority()) 虽然使用了智能指针来管理资源但是,由于参数值计算顺序的 ...
- 原生JS编写getByClass、addClass、removeClass、hasClass
前言: 年后换了工作,在现在的公司写交互主要使用JS原生:刚刚入门前端的时候写交互一直用的原生JS,虽然用的不怎么样.后来去之前的公司之后,leader主张把jQuery用好,JS原生自然就熟练了:一 ...
- csharp:Learn how to post JSON string to generic Handler using jQuery in ASP.Net C#.
/// <summary> ///參考: http://james.newtonking.com/json/help/index.html# /// 塗聚文(Geovin Du) 2014 ...
- Web前端面试指导(十九):CSS样式-如何清除元素浮动?
题目点评 本题属于比较常问的题目,也是在网页设计中经常遇到的问题,面试官希望通过这样的面试题来了解你对网页设计的基本功底,如果这样的题目答不出来,必会让面试官大失所望,面试成功的概率是非常小的. 答题 ...