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

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)

http://www.lryc.cn/news/2397633.html

相关文章:

  • MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)
  • React 组件异常捕获机制详解
  • 手眼标定:九点标定、十二点标定、OpenCV 手眼标定
  • [总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析
  • React-native的新架构
  • 【Android】MT6835 + MT6631 WiFi进入Meta模式出现WiFi_HQA_OpenAdapter failed
  • Git 全平台安装指南:从 Linux 到 Windows 的详细教程
  • Tree 树形组件封装
  • AI书签管理工具开发全记录(五):后端服务搭建与API实现
  • netTAP 100:在机器人技术中将 POWERLINK 转换为 EtherNet/IP
  • 多模态大语言模型arxiv论文略读(九十八)
  • EXCEL--累加,获取大于某个值的第一个数
  • 【vscode】切换英文字母大小写快捷键如何配置
  • vue笔记-路由
  • 本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】
  • 域名解析怎么查询?有哪些域名解析查询方式?
  • win主机如何结束正在执行的任务进程并重启
  • maven中的maven-resources-plugin插件详解
  • ROS云课基础篇-01-Linux-250529
  • 通俗易懂解析:@ComponentScan 与 @MapperScan 的异同与用法
  • 深入了解 C# 异步编程库 AsyncEx
  • NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制
  • Vulhub靶场搭建(Ubuntu)
  • C++:参数传递方法(Parameter Passing Methods)
  • 大语言模型的推理能力
  • 基于BERT和GPT2的实现来理解Transformer的结构和原理
  • .net consul服务注册与发现
  • WifiEspNow库函数详解
  • rsync使用守护进程启动服务
  • React 核心概念与生态系统