leetcode78.子集➕90.子集2
78子集
dfs
dfs1:
和全排列的区别就是对于当前考察的索引i,全排列如果不取i,之后还要取i,所以需要一个visited数组用来记录。对于子集问题如果不取i,之后也不必再取i。
单纯递归回溯
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> cur;
vector<vector<int>>res;
dfs(res,cur,nums,0);
return res;
}
void dfs(vector<vector<int>>&res,vector<int>&cur,vector<int>&nums,int nex){
res.push_back(cur);
for(int i=nex;i<nums.size();++i){
cur.push_back(nums[i]);
dfs(res,cur,nums,i+1);
cur.pop_back();
}
}
};
dfs2:类似树的递归遍历,一个dfs函数里有两个dfs递归子函数,一个是含当前数字的子递归,一个是不含当前数字的子递归。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<int>cur;
vector<vector<int>>res;
dfs(res,cur,nums,0);
return res;
}
void dfs(vector<vector<int>>&res,vector<int>&cur,vector<int>&nums,int nex){
if(nex>=nums.size()){
res.push_back(cur);
return;
}
cur.push_back(nums[nex]);
dfs(res,cur,nums,nex+1);
cur.pop_back();
dfs(res,cur,nums,nex+1);
}
};
位运算
因为所以数字都不一一样,每个数字都有两种可能,一个取一个不取。假设一共n个元素,则一共有2的n次方个子集,其中每个子集都对应一个小于2的n次方的数。如n==4,1001对应首尾数字取,中间两个数字不取
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n=nums.size();
vector<vector<int>>res;
for(int i=0;i<pow(2,n);++i){
int j=i,k=n-1;
res.push_back({});
while(j){
if(j&1){
res.back().push_back(nums[k]);
}
j>>=1;
--k;
}
}
return res;
}
};
循环
空生空+【1】,空加【1】生空+【1】加【2】加【1,2】。
即1生2,2生4,4生8。。。。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>>res={{}};
for(const int& num:nums){
int cur_size=res.size();
for(int i=0;i<cur_size;++i){
res.push_back(res[i]);
res.back().push_back(num);
}
}
return res;
}
};
90 子集2
循环
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>>res={{}};
unordered_map<int,int> mp;
for(int num:nums){
mp[num]+=1;
}
for(const auto& pai:mp){
int cur_size=res.size();
for(int i=0;i<cur_size;++i){
res.push_back(res[i]);
for(int j=0;j<pai.second;++j){
res.back().push_back(pai.first);
res.push_back(res.back());
}
res.pop_back();
}
}
return res;
}
};
dfs
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res;
vector<int>cur;
dfs(res,nums,cur,0);
return res;
}
void dfs(vector<vector<int>>&res,vector<int>&nums,vector<int>&cur,int nex){
res.push_back(cur);
for(int i=nex;i<nums.size();++i){
while(i-1>=nex and i<nums.size() and nums[i]==nums[i-1]){
++i;
}
if(i>=nums.size()){return;}
cur.push_back(nums[i]);
dfs(res,nums,cur,i+1);
cur.pop_back();
}
}
};
leetcode78.子集➕90.子集2的更多相关文章
- 90. 子集 II
90. 子集 II 题意 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], ...
- Leetcode之回溯法专题-90. 子集 II(Subsets II)
Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...
- Java实现 LeetCode 90 子集 II(二)
90. 子集 II 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [ ...
- [leetcode] 90. 子集 II.md
90. 子集 II 78. 子集题的扩展,其中的元素可能会出现重复了 我们仍沿用78题的代码,稍作改动即可: 此时需要对nums先排个序,方便我们后面跳过选取相同的子集. 跳过选取相同的子集.当选取完 ...
- leetcode刷题-90子集 II
题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], [1,2,2], [ ...
- leetcode 90. 子集 II JAVA
题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2] ...
- Leetcode 90.子集
子集 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], ...
- Leetcode 90. 子集 II
地址 https://leetcode-cn.com/problems/subsets-ii/ 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重 ...
- LeetCode 90. 子集 II(Subsets II)
题目描述 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2 ...
随机推荐
- vue.js父组件引入子组件,父组件向子组件传值
先看看目录结构app.vue为父组件,components里面的文件为子组件 下面这张图是父组件app.vue中的内容 下面这张图是子组件student.vue中的内容 这样父组件中的sdt数据就传入 ...
- unserialize():Error at offset 0 of 96 bytes是什么意思
数据库有个列是数组序列化后存到数据库的,取出来得反序列化, php想要把数组保存到数据库里,有两种序列化方式,分别是: //php系统序列化 $b = serialize($a); //序列化数 ...
- linux--nginx学习
nginx 1.nginx安装编译 1.yum install nginx(自动解决依赖) 2.源代码编译安装(优秀,自由选择软件版本,自定义第三方功能比如开启https) 3.rpm手动安装(垃圾) ...
- 关于npm 的注意事项
npm install 之后 会生成package-lock.json 文件 ,注意这个文件不能删除,否则每次 npm i 之后,node_modules都装的是最新的,会出现意想不到的问题.
- R语言函数化学习笔记6
R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...
- 关闭visual studio code 智能提示功能
对于程序初学者来说,应该少用IDE的提示功能,因为这样有助于记住一些常用的函数等功能.这也是为什么戏称喜欢用notepad++(windows)或者vim编辑器(Linux)来开发代码是大神的原因,而 ...
- LaTeX技巧012:LaTeX 插图加载宏包
LaTeX 插图加载宏包.支持 LaTeX - DVIPDFMx; pdfLaTeX; XeLaTeX 三种编译方式,支持 eps/pdf/jpg/png 等图片格式. % Put this snip ...
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”
出现场景: From1中事件B绑定在事件A,事件A由工厂模式下的设备产生,当离开Form1时,设备中的事件A仍然会触发事件B,此时就会导致如上问题 原因(个人理解): 1.Form1已经被销毁了,但仍 ...
- Python3标准库:difflib差异计算工具
1. difflib差异计算工具 此模块提供用于比较序列的类和函数. 例如,它可以用于比较文件,并可以产生各种格式的不同信息,包括HTML和上下文以及统一格式的差异点.有关目录和文件的比较,请参见fi ...
- DES加密算法 转
1.什么是对称密码算法 网络安全通信中要用到两类密码算法,一类是对称密码算法,另一类是非对称密码算法.对称密码算法有时又叫传统密码算法.秘密密钥算法或单密钥算法,非对称密码算法也叫公开密钥密码算法或双 ...