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

  1. 90. 子集 II

    90. 子集 II 题意 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], ...

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

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

  3. Java实现 LeetCode 90 子集 II(二)

    90. 子集 II 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [ ...

  4. [leetcode] 90. 子集 II.md

    90. 子集 II 78. 子集题的扩展,其中的元素可能会出现重复了 我们仍沿用78题的代码,稍作改动即可: 此时需要对nums先排个序,方便我们后面跳过选取相同的子集. 跳过选取相同的子集.当选取完 ...

  5. leetcode刷题-90子集 II

    题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], [1,2,2], [ ...

  6. leetcode 90. 子集 II JAVA

    题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2] ...

  7. Leetcode 90.子集

    子集 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], ...

  8. Leetcode 90. 子集 II

    地址  https://leetcode-cn.com/problems/subsets-ii/ 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重 ...

  9. LeetCode 90. 子集 II(Subsets II)

    题目描述 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2 ...

随机推荐

  1. 2级搭建类201-Oracle 12cR2 单实例 ASM(OEL7.7)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  2. div中宽高度自适应文字换行居中问题解决

    <html> <head> <meta charset="UTF-8"/> <title>div中宽高度自适应文字换行居中demo& ...

  3. Python中io的open()在PyCharm环境下报错和路劲的问题

    PS:我也是初学者,上班空闲时间学习学习Python.今天学到io的时候,遇到了两个用PyCharm环境编写代码的小白错误,如下: 两个问题都是如下代码: 1. 第一个问题:当写好代码之后,点击运行报 ...

  4. Git分支规范说明

    1.分支类型说明 分支名称 分支描述 唯一 权限管理 release 发布分支,内部分支,当确定需要发布版本时,从develop分支拉出此分支 唯一 最高权限,由版本经理或者团队核心成员组管理 mas ...

  5. 大二上学期Javaweb阶段性学习总结

    本学期主要学了h5,css3,js,Java,SQL server数据库基本操作等相关知识,学会了简单web系统的制作. 这个学期总的来说学到了很多东西. 前期Java学习因为有了暑期学习及pta上5 ...

  6. Eclipse创建JSP、HTML、CSS文件默认字符集设置成UTF-8

    问题:在使用eclipse的时候总是发现新创建的JSP文件.HTML文件等默认总是ISO-8859-1,每次都要修改成自己使用的utf-8的,很是麻烦,因此在网上查看了一下发现是可以修改字符集的默认值 ...

  7. C++查看大端小端模式

    在学习计算机组成原理的时候,看到大端小端模式,便想实验一下,首先介绍一下 C 中的union,这个平时用得少,估计在单片机这种可能会运用,在平时写代码的时候几乎是用不着union的. union:联合 ...

  8. linux - 异常:安装包冲突 conflicts with

    问题描述 解决方案 删除冲突的包 命令格式:yum -y remove 包名 yum -y remove httpd24u yum -y remove httpd24u-tools

  9. 根据JSON的值设置radio选中状态

    说明:页面有一组单选按钮radio,现在页面发送请求得到一组json数据,包括radio的值. 需要根据JSON中的值绑定radio的选中状态> <table class="ta ...

  10. windows 10 安装使用kafka

    1.安装java环境 自行百度 2. 下载.安装Kafka 打开 下载地址 http://kafka.apache.org/downloads.html 下载二进制文件 Kafka包名组成: Scal ...