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

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.xdnf.cn/news/10570.html

相关文章:

  • DrissionPage 数据提取技巧全解析:从入门到实战
  • vulnyx loweb writeup
  • 12.2Swing中JButton简单分析
  • 05-power BI高级筛选器filter与Values人工造表
  • 【烧脑算法】不定长滑动窗口:从动态调整到精准匹配以灵活特性实现高效破题
  • 第2篇:数据库连接池原理与自定义连接池开发实践
  • 01 Ubuntu20.04下编译QEMU8.2.4,交叉编译32位ARM程序,运行ARM程序的方法
  • 基于GPT-SoVITS-v4-TTS的音频文本推理,流式生成
  • 第12次13: 修改登录密码
  • 《 C++ 点滴漫谈: 四十 》文本的艺术:C++ 正则表达式的高效应用之道
  • Linux学习笔记:shell脚本篇(1)
  • 【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)
  • Perl One-liner 数据处理——基础语法篇【匠心】
  • Go 语言 + Word 文档模板:WordZero 引擎如何让企业文档处理效率提升 300%?
  • 使命召唤16:现代战争 MOD整合包 豪华中文 免安 离线运行版
  • 做好 4个基本动作,拦住性能优化改坏原功能的bug
  • Hadoop学习笔记
  • 开源的JT1078转GB28181服务器
  • 一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban
  • Vue 项目创建教程 (开发前的准备工作保姆级辅助文档)
  • 系统调用与程序接口的关系
  • 业务到解决方案构想
  • JVM——从JIT到AOT:JVM编译器的云原生演进之路
  • Modern C++(二)预处理器及表达式
  • 6个月Python学习计划 Day 12 - 字符串处理 文件路径操作
  • 企业级应用狂潮:从Spotify到LinkedIn的Llama实战手册
  • MySQL:视图+用户管理+访问+连接池原理
  • 任务26:绘制1-12月各省份平均气温和预测可视化图形(折线
  • Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术
  • Linux(10)——第二个小程序(自制shell)