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 ...
随机推荐
- Burp Suite Professional 针对APP抓包篡改数据提交【安全】
Burp Suite 是用于攻击web 应用程序的集成平台,包含了许多工具.Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程.所有工具都共享一个请求,并能处理对应的HTTP 消息 ...
- H5_0013:CSS特色样式集
按比例变化,同时又限制最大宽高 ".start-wrap {", " width:40%;", " top: 83.21%;", " ...
- mysql常用函数及关键字汇总
关键字 1...mysql包含之in SELECT count(1) as count FROM 表名 a,表名 b WHERE a.主键 = b.外键 and a.字段 in('1','2,'3' ...
- Visual Studio Code 搭建 C/C++开发环境方法总结
之前看错资料踩了不少坑,先将可行经验总结如下: 1. 下载 Visual Studio Code 并安装.地址:https://code.visualstudio.com 2. 安装 C/C++插件与 ...
- HTML连载64-a标签伪类选择器的注意点与练习
一.a标签的伪类选择器注意点 (1)a标签的伪类选择器可以单独出现,也可以一起出现.也就是可以设置多个状态的样式. (2) a标签的伪类选择器如果一起出现,那么有严格的顺序要求,编写的顺序必须要遵守原 ...
- Windows Server多用户同时远程登录
因为工作需要,需要使用windwos作为一个远程登录跳板机,管理员对登录windwos机器再windwos的基础上连接别的机器,普通用户也可以连接windwos机器再连接别的机器,关于管理员普通用户连 ...
- java面试记录一:跳表、判断二叉树相同、冒泡排序、cookie和session的区别、设计模式(单例、工厂、模板方法、原型、代理、策略)、抽象类与接口的区别
1.什么是跳表? 跳表实际上就是多层链表 跳表可用在让链表的元素查询接近线性时间 代码结构及java实现参考博客园随笔 2.判断两棵二叉树是否相同?(结构相同,内容相同) 思路:(1)先定义树节点Tr ...
- [USACO12DEC]First!
Description Luogu3065 Solution 首先,一个串要是最小的,别的串不能是它的前缀,且和它有相同前缀的串字典序都比他小. Trie树是显然要用的,难点在于如何判断能否最小.其实 ...
- 白面系列 nginx
Nginx == engine x. nginx就是一个服务器.主要提供web服务.负载均衡(反向代理).web缓存等服务. nginx ≈ apache,但nginx是轻量级的高性能高并发的服务器. ...
- python中使用anaconda对不平衡数据的处理包imblearn的安装
为了建模,处理不平衡数据,想使用SMOTEENN方法进行数据平衡处理,为此需要下载对应的包imblearn 最开始直接从anaconda中进行: conda install imblearn 报 ...