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 ...
随机推荐
- Node.js学习笔记(三) --- package.json 及cnpm
一.包 Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理. 完全符合 ...
- 学会Markdown,写博客不愁
前言 Markdown是一种轻量级的标记语言,有John Gruber以及Aaron Hillel Swartz一起编写.Aaron Hillel Swartz是一个极富传奇的黑客,有兴趣可以看看他的 ...
- 在 CentOS6 上安装 GraphicsMagick-1.3.30
在 CentOS6 上安装 GraphicsMagick-1.3.30 1.简介: 1.1.在介绍 GraphicsMagick 前我们不得不先介绍下 ImageMagick: ImageMagick ...
- Eclipse常用操作
一 Eclipse常用快捷键 ctrl+Q:跳到最后一次编辑处. ctrl+F:在当前文件中查找并替换. ctrl+T:查看类的继承关系. alt+左箭头:返回到光标的上一个位置. alt+右箭头:前 ...
- ubuntu终端颜色设置
在 .bashrc中增加 PS1='${debian_chroot:+($debian_chroot)}\[\033[00;32m\]\u @ \h\[\033[00m\]:\[\033[00;34m ...
- ogr2ogr使用
简介 org2ogr是OGR模块中提供的一个重要工具,用于对数据源进行格式转换 使用方式 命令行参数 [xingxing.dxx@30_28_6_20 J50F001020]$ ogr2ogr --l ...
- Android sqlite日期存储
SQLite日期类型是以TEXT.REAL和INTEGER类型分别不同的格式表示的,对应如下:TEXT: "YYYY-MM-DD HH:MM:SS.SSS"REAL: 以Julia ...
- 【Python】面向对象编程思想
概念 "笔"作为一个抽象的概念,可以被看成是一个类.而一支实实在在的笔,则是"笔"这种类型的对象. 一个类可以有属于它的函数,这种函数被称为类的"方法 ...
- C++模板详解(系转载,但是个人添加了一些内容)
原文地址:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html 零.概述 模板是C++支持参数化多态的工具,使用模板可以使用户为类或 ...
- Dapper 批量操作sql
static void Main(string[] args) { private static readonly string sqlconnection =""; //遍历循环 ...