当前位置: 首页 > news >正文

leetcode hot100刷题日记——35.子集

在这里插入图片描述
解答:

方法一:选or不选的dfs(输入视角)

思路:[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。
eg.空集就是一个数字都不选,[1,2]就是1,2选,3不选。

class Solution {
public:vector<vector<int>> res;//存所有结果用的vector<int> path;//存单个结果void dfs(vector<int>&nums,int pos,int size){if(pos==size){//遍历到了数组的最后,做完了所有的选择,为什么size是n前面的日记解释过了~res.emplace_back(path);//把单个结果放进总结果里面,注意emplace_back函数,之前也出现过几次了return;}//对于单个数字,我们的选择有两种//1.选path.push_back(nums[pos]);//放进单个数组dfs(nums,pos+1,size);//做好选择后再去做下一个选择path.pop_back();//回溯的精髓,恢复原状//2.不选dfs(nums,pos+1,size);//直接做下一个选择	}vector<vector<int>> subsets(vector<int>& nums) {int size=nums.size();dfs(nums,0,size);return res;}
};

时间复杂度:O(n2^n)
空间复杂度:O(n)

方法二:选or不选的dfs(输出视角)

思路:如果选了数组的某一位添加到答案末尾,那么下一个要添加到答案末尾的数,就要在这个某一位后面的数字中枚举了。用循环来帮忙

举个例子哦,对于子集[1,2,3]来说,从1开始思考,1要不要在我的子集里面,要的话那就放进去,不要的话那就恢复现场
再接着考虑下一位2……

class Solution {
public:vector<vector<int>> res;//存所有结果用的vector<int> path;//存单个结果void dfs(vector<int>&nums,int pos,int size){res.emplace_back(path);//每次做完这个数要不要选的结果都放进去总结果里面//从path的当前位置开始考虑要不要选for(int i=pos;i<size;i++){path.push_back(nums[i]);//要选dfs(nums,i+1,size);//下一个开始选择path.pop_back();//恢复现场}}vector<vector<int>> subsets(vector<int>& nums) {int size=nums.size();dfs(nums,0,size);return res;}
};

时间复杂度:O(n2^n)
空间复杂度:O(n)

方法三:二进制枚举
使用位运算来高效枚举所有可能的组合
比如[1,2,3],我们枚举xxx所有的二进制可能(000,001,010……)如果是000就是空集,001就是把3放进去,010就是放2……

二进制数对应的这一位是1就相当于选这位数,0就是不选。

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {int n=nums.size();vector<vector<int>> res(1<<n);//一共1<<n种结果//i是结果数,j是位数for(int i=0;i<(1<<n);i++){for(int j=0;j<n;j++){// 判断第j位是否为1if(i>>j&1)res[i].push_back(nums[j]);//是1的话就放进去结果}} return res;}
};

时间复杂度:O(n2^n)
空间复杂度:O(1)

相关文章:

  • day17 leetcode-hot100-34(链表13)
  • 每日算法刷题计划Day20 6.2:leetcode二分答案3道题,用时1h20min
  • 从 LeetCode 到日志匹配:一行 Swift 实现规则识别
  • 力扣LeetBook数组和字符串--数组简介
  • 【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
  • NodeJS全栈WEB3面试题——P8项目实战类问题(偏全栈)
  • 电脑wifi显示已禁用怎么点都无法启用
  • Java线程生命周期详解
  • GStreamer开发笔记(六):gstreamer基本概念:组件、箱柜、管道、衬垫、链接组件
  • 【存储基础】存储设备和服务器的关系和区别
  • 4、ubuntu系统 | 文本和目录操作函数
  • 设备驱动与文件系统:03 生磁盘的使用
  • Python 训练营打卡 Day 33-神经网络
  • SpringMVC的注解
  • Java设计模式之备忘录模式详解
  • 【小沐杂货铺】基于Three.JS构建IFC模型浏览器(WebGL、CAD、Revit、IFC)
  • 使用source ~/.bashrc修改环境变量之后,关闭服务器,在重启,环境变量还有吗?
  • Spark-TTS: AI语音合成的“变声大师“
  • 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——4. 配置服务器终端环境 zsh , oh my zsh, vim
  • isp中的 ISO代表什么意思
  • 阿里云做网站教程/网络推广公司哪里好
  • 在线下单网站怎么做/官网seo关键词排名系统
  • 南通做公司网站/排超联赛积分榜
  • 做电影网站赚钱知乎/百度贴吧网页入口
  • 免费模板网站/如何写营销软文
  • 网站建设与域名备案/谷歌google官网下载