给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

元素互不相同,那么每个元素可以都在集合中,也可以都不在。每个元素在或不在,构成了不同的子集。

我们用一个01序列表示这些数在还是不在。序列中,第 i 位是0表示题目中的 nums[i] 不在,第 i 位是1表示 nums[i] 在。现在我们只需要遍历所有可能的序列号就行。

怎么遍历序列号呢。n位的序列,种可能,十进制从0到,把十进制数转换成二进制,然后遍历这个二进制数的每一位就行了。下面是力扣的代码:

class Solution {
public:vector<int> t;    //每一种序列号对应的子集,用来加到ans里vector<vector<int>> ans;    //所有子集的集合,用来提交vector<vector<int>> subsets(vector<int>& nums) {int n = nums.size();    //序列长n位for (int mask = 0; mask < (1 << n); ++mask) {//mask是一个十进制数,从0到2^n-1,t.clear();    //清空原来的那个tfor (int i = 0; i < n; ++i) {    //表示第i位,i从0到n-1if (mask & (1 << i)) {    //相当于把mask转换成二进制,保留第i位,其他位置为0t.push_back(nums[i]);    //加到t里}}ans.push_back(t);    //t加到ans里}return ans;}
};

或者,我们直接枚举序列 a 的所有子序列。

这里利用深度优先搜索的思想枚举:即“一条路走到黑”,再重走。

为了分辨当前处于这条“路”的哪个“位置”、有没有走到底,对不同的位置采取不同的措施,函数需要一个位置参数。为了在过了当前这个位置以后到下个位置,函数里需要一步转移。

下面是力扣的代码:

class Solution {
public:vector<int> t;vector<vector<int>> ans;void dfs(int cur, vector<int>& nums) {//表示当前位置是 cur,以及原数组if (cur == nums.size()) {//当 cur 增加到 n 的时候,记录答案并终止递归ans.push_back(t);return;}//进入 dfs(cur,n) 时 函数刚从 dfs(cur,n-1) 部分出来,位置 [0.cur-1] 是确定的,//而 [cur,n−1] 内位置的状态是不确定的,现在我们处理第cur位//再执行 dfs(cur+1,n);//执行结束后对 t 进行回溯,表示不取nums[cur],然后直接执行 dfs(cur+1,n)。t.push_back(nums[cur]);//相当于这个位置取dfs(cur + 1, nums);//取完了以后继续沿这条路走t.pop_back();//当进行到这一步,说明 dfs(cur + 1, nums) 已经返回了,//现在在走回头路,根据dfs思想,此时要撤销对路径的改变。dfs(cur + 1, nums);//刚刚撤销改变就往下一个位置走,相当于这个位置没改变,就是不取}vector<vector<int>> subsets(vector<int>& nums) {dfs(0, nums);return ans;}
};

【题解】力扣78.子集相关推荐

  1. leetcode力扣78. 子集

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

  2. 力扣78. 子集(JavaScript)

    //遍历整棵树,不需要中止条件 var subsets = function(nums) {let arr=[]let p=[]const dd=function(index){arr.push([. ...

  3. 力扣78 77 46 子集、排列、组合 C++ 回溯法

    不同题目只需要解除相应的define注释即可 力扣78 子集 力扣77 组合 力扣46 全排列 #define SUBSET 1 // 子集//#define COMBINE 1 // 组合//#de ...

  4. 力扣第三题java_LeetCode 题解 | 力扣杯 LCP 06. 拿硬币

    力扣杯 LCP 06. 拿硬币(点击查看题目) 力扣​leetcode-cn.com 题目描述 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者 ...

  5. 力扣90. 子集 II(JavaScript)

    var subsetsWithDup = function(nums) {let arr=[]let p=[]//去重需要排序nums.sort()const dd=function(index){/ ...

  6. 子集和问题 算法_LeetCode 题解 | 78.子集

    力扣 78. 子集 (点击查看题目) 力扣​leetcode-cn.com 题目描述 给定一组 不含重复元素 的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. ...

  7. 力扣刷题记录-回溯算法相关题目

    首先介绍一下回溯算法 回溯通常在递归函数中体现,本质也是一种暴力的搜索方法,但可以解决一些用for循环暴力解决不了的问题,其应用有: 1.组合问题: 例:1 2 3 4这些数中找出组合为2的组合,有1 ...

  8. 力扣121、122、309、714(C语言版)动态规划股票问题

    具体思路看 309. 最佳买卖股票时机含冷冻期 题解 - 力扣(LeetCode) (leetcode-cn.com) 1.买卖股票的最佳时机121(只能一次买卖) 给定一个数组 prices ,它的 ...

  9. 20201016:力扣第210周周赛题解(下)

    力扣第210周周赛题解(下) 题目 思路与算法 代码实现 写在最后 题目 分割两个字符串得到回文串 统计子树中城市之间最大距离 思路与算法 第三题主要逻辑通顺就行,注意分割的索引是一样的,那么判断回文 ...

最新文章

  1. 解决maven下载jar慢的问题(如何更换Maven下载源)
  2. 新技能get!判断盒子的实际大小及位置。。。
  3. linux查看当前shell的方法
  4. SAP 电商云 Spartacus UI 代码提交的 commit 信息规范
  5. Android ping命令 -- Runtime
  6. 【渝粤教育】电大中专电商运营实操 (25)作业 题库
  7. 利用redis实现分布式锁:加锁与解锁
  8. ios 桥接文件找不到文件_电脑文件搜索神器,没有找不到的东西
  9. %3c php foreach%3e,PHP 数组函数-数组排序
  10. 不同vlan同段IP通信
  11. 面向对象的三大特性之多态,封装基础
  12. 不要做浮躁的软件工程师——经典
  13. 僵化封闭的苹果:鼠标不支持右键,键盘没有DEL键
  14. Windows历史版本
  15. CS领域论文数据分析
  16. lg空调代码大全解决_LG空调故障代码大全-kg空调维修-lg空调维修手册
  17. 计算机软件ui外观设计专利,GUI外观设计专利申请指南
  18. 2021FME博客大赛 —— FME在无名河流水系实体化中的应用实践
  19. 如何一键查询名下所有银行卡?
  20. 微信内隐藏的一个修复功能

热门文章

  1. 计算机动态储存,动态存储器
  2. springboot房屋租赁管理系统的设计与实现
  3. 【python远程linux、执行命令、读取excel】
  4. class和Class的区别
  5. 硬件 CPU Intel® Xeon® Processor E5520
  6. 产学融合如何促进技术创新,英特尔打了个样
  7. Android studio 关于页面跳转问题
  8. 利用turf.js分析数据---占地分析
  9. 【CJY学习笔记】Redis容器的配置
  10. C语言,输入硬币面值和硬币个数,换成输出一分,两份,五分硬币亦硬币个数