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 ...
随机推荐
- Opencv中图像的遍历与像素操作
Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...
- JVM(五) class类文件的结构
概述 class类文件的结构可见下面这样图(出处见参考资料),可以参照下面的例子,对应十六进制码,找出找出相应的信息. 其中u2 , u4 表示的意思是占用两个字节和占用四个字节,下面我们将会各项说明 ...
- SSM实现批量删除功能
批量删除功能的实现 其实实现这个功能还是挺简单的 因为我这是直接拼接的,所以用了DOM方法来获取id话不多说直接上代码首先是复选框全选和反选这里的话 获取最上面一个复选框的状态同步到拼接的复选框 $ ...
- ThreadLocal介绍以及源码分析
ThreadLocal 线程主变量 前面部分引用其他优秀博客,后面源码自己分析的,如有冒犯请私聊我. 用Java语言开发的同学对 ThreadLocal 应该都不会陌生,这个类的使用场景很多,特别是在 ...
- COGS2259 异化多肽
传送门 听说是多项式求逆的模板题,以后不怕没地方练多项式求逆啦哈哈…… …… 我们设使用一个氨基酸能组成质量为$n$的多肽数量这个数列为$\{a_n\}$,设它的生成函数为$A(x)$,显然有 \be ...
- react+antd 选项卡切换
index.js: import React from 'react'; import ReactDOM from 'react-dom'; import CardSecond from './Car ...
- Aysnc-callback with future in distributed system
Aysnc-callback with future in distributed system
- 动画演示10个有趣但毫无用处的Linux命令
Linux最强大的一个特征就是它有大量的各种小命令工具,这也可以称做是它最有趣的一个地方了.在这些大量的有用的命令和脚本中,你会发现有少部 分命令工具不那么有用的——如果你不愿意说是完全没用处的话.你 ...
- Excel 函数使用
字符串 20180613 转为日期 2018-06-13,单元格内输入如下公式 =DATE(LEFT(),MID(,),RIGHT()) IF 函数内的或.与 =IF(AND(A=B,C=D),&q ...
- Java集合工具类
import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map ...