【题解】力扣78.子集
“
给你一个整数数组
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.子集相关推荐
- leetcode力扣78. 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- 力扣78. 子集(JavaScript)
//遍历整棵树,不需要中止条件 var subsets = function(nums) {let arr=[]let p=[]const dd=function(index){arr.push([. ...
- 力扣78 77 46 子集、排列、组合 C++ 回溯法
不同题目只需要解除相应的define注释即可 力扣78 子集 力扣77 组合 力扣46 全排列 #define SUBSET 1 // 子集//#define COMBINE 1 // 组合//#de ...
- 力扣第三题java_LeetCode 题解 | 力扣杯 LCP 06. 拿硬币
力扣杯 LCP 06. 拿硬币(点击查看题目) 力扣leetcode-cn.com 题目描述 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者 ...
- 力扣90. 子集 II(JavaScript)
var subsetsWithDup = function(nums) {let arr=[]let p=[]//去重需要排序nums.sort()const dd=function(index){/ ...
- 子集和问题 算法_LeetCode 题解 | 78.子集
力扣 78. 子集 (点击查看题目) 力扣leetcode-cn.com 题目描述 给定一组 不含重复元素 的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. ...
- 力扣刷题记录-回溯算法相关题目
首先介绍一下回溯算法 回溯通常在递归函数中体现,本质也是一种暴力的搜索方法,但可以解决一些用for循环暴力解决不了的问题,其应用有: 1.组合问题: 例:1 2 3 4这些数中找出组合为2的组合,有1 ...
- 力扣121、122、309、714(C语言版)动态规划股票问题
具体思路看 309. 最佳买卖股票时机含冷冻期 题解 - 力扣(LeetCode) (leetcode-cn.com) 1.买卖股票的最佳时机121(只能一次买卖) 给定一个数组 prices ,它的 ...
- 20201016:力扣第210周周赛题解(下)
力扣第210周周赛题解(下) 题目 思路与算法 代码实现 写在最后 题目 分割两个字符串得到回文串 统计子树中城市之间最大距离 思路与算法 第三题主要逻辑通顺就行,注意分割的索引是一样的,那么判断回文 ...
最新文章
- 解决maven下载jar慢的问题(如何更换Maven下载源)
- 新技能get!判断盒子的实际大小及位置。。。
- linux查看当前shell的方法
- SAP 电商云 Spartacus UI 代码提交的 commit 信息规范
- Android ping命令 -- Runtime
- 【渝粤教育】电大中专电商运营实操 (25)作业 题库
- 利用redis实现分布式锁:加锁与解锁
- ios 桥接文件找不到文件_电脑文件搜索神器,没有找不到的东西
- %3c php foreach%3e,PHP 数组函数-数组排序
- 不同vlan同段IP通信
- 面向对象的三大特性之多态,封装基础
- 不要做浮躁的软件工程师——经典
- 僵化封闭的苹果:鼠标不支持右键,键盘没有DEL键
- Windows历史版本
- CS领域论文数据分析
- lg空调代码大全解决_LG空调故障代码大全-kg空调维修-lg空调维修手册
- 计算机软件ui外观设计专利,GUI外观设计专利申请指南
- 2021FME博客大赛 —— FME在无名河流水系实体化中的应用实践
- 如何一键查询名下所有银行卡?
- 微信内隐藏的一个修复功能