第一题是输入数组的数值不相同,第二题是输入数组的数值有相同的值,第二题在第一题的基础上需要过滤掉那些相同的数值。

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的更多相关文章

  1. 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 ...

  2. leetcode 51. N-Queens 、52. N-Queens II

    51. N-Queens 使用isValid判断当前的位置是否合法 每次遍历一行,使用queenCol记录之前行的存储位置,一方面是用于判断合法,另一方面可以根据存储结果输出最终的结果 class S ...

  3. Leetcode之回溯法专题-90. 子集 II(Subsets II)

    Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...

  4. [LeetCode] 90.Subsets II tag: backtracking

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  5. [leetcode]90. Subsets II数组子集(有重)

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  6. [LeetCode] 90. Subsets II 子集合 II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  7. LeetCode Problem 90. Subsets II

    python solution 123456789101112131415161718192021222324252627 class (object): def subsetsWithDup(sel ...

  8. 【LeetCode】90.Subsets II

    Subsets II Given a collection of integers that might contain duplicates, nums, return all possible s ...

  9. LeetCode 78. 子集(Subsets) 34

    78. 子集 78. Subsets 题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: 解集不能包含重复的子集. 每日一算法2019/6/6Day 34L ...

随机推荐

  1. Java - XPath解析爬取内容

    code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } pre { backg ...

  2. Flash流媒体服务器软件

    所谓流媒体技术,是指将连续的影像和声音信息经过压缩处理后放在网站服务器上,让用户能够一边下载一边观看.收听(即所谓的“在线欣赏”),而不需要等整个压缩文件下载到自己的机器上才可以欣赏的网络传输技术.目 ...

  3. java 的数据库操作--JDBC

    一.java与数据库的交互 1.jdbc:java data base connectivity,java数据库连接.java的JDBC操作主要通过操作两个类进行连接操作:Connection 和 S ...

  4. HttpResponse Entity的处理(将字符数组转为JSON)

    1.问题背景 调用高德的IP地址查询接口,获取的返回值为字符串数组(如下); 因为这里只是纯字符串,并不是真正的数组,无法直接取值,所以想到看能不能转为数组或者JSON再进行取值. 2.解决: 通过在 ...

  5. IndexedDB(二:索引)

    在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...

  6. console的一些方法

    原文参考http://mp.weixin.qq.com/s?__biz=MzU3MDA0NTMzMA==&mid=2247485510&idx=2&sn=0adff5754a2 ...

  7. C语言——顺序表插入、删除、定位运算算法

    说明:将元素x插入到顺序表L的第i个数据元素之前,这个i是从1开始的,但是程序中数组都是从0算起的,不要混淆了. 头文件: header.h // 顺序表的结构定义 #define Maxsize 1 ...

  8. 日常捕获的野生知识 - javascript 与 类

    javascript 并不提供类这样方便实用的面向对象类型,今天学习到了,直接上代码: <!DOCTYPE html> <html lang="en"> & ...

  9. Windows Server 2008 R2配置JSP网站无法访问

    在Windows Server 2008 R2中配置好JSP网站后,在本机可以使用 localhost访问网站,但是局域网内其机器无法访问,则需要在Windows Server 2008 R2的系统管 ...

  10. EditText的setInputType方法里面应该填什么?

    转自CSDN:http://blog.csdn.net/u014158743/article/details/52488010 | 以密码类型(password)为例 android:inputTyp ...