当前位置: 首页 > 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)

http://www.lqws.cn/news/68653.html

相关文章:

  • Rust 变量与可变性
  • 实现Cursor + Pycharm 交互
  • 【leetcode】459.重复的子字符串
  • Java实习面试题
  • arc3.2语言sort的时候报错:(sort < `(2 9 3 7 5 1)) 需要写成这种:(sort > (pair (list 3 2)))
  • Python 训练营打卡 Day 33-神经网络
  • 电脑的ip地址会自动变怎么办?原因解析和解决方法
  • 【Ragflow】24.Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题
  • 神经网络与深度学习(第二章)
  • 神经网络基础:从单个神经元到多层网络(superior哥AI系列第3期)
  • 玩客云 OEC/OECT 笔记(2) 运行RKNN程序
  • LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架
  • TS 星际通信指南:从 TCP 到 UDP 的宇宙漫游
  • StarRocks物化视图
  • 基于 StarRocks + Iceberg,TRM Labs 构建 PB 级数据分析平台实践
  • 4.大语言模型预备数学知识
  • 从线性方程组角度理解公式 s=n−r(3E−A)
  • 用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包
  • 一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban
  • spring-cloud-alibaba-sentinel-gateway
  • 基于 Alpine 定制单功能用途(kiosk)电脑
  • FPGA仿真中阻塞赋值(=)和非阻塞赋值(<=)区别
  • 线性代数复习
  • ios tableview吸顶
  • 线段树刷题记录
  • OpenCV——Mac系统搭建OpenCV的Java环境
  • 详解鸿蒙仓颉开发语言中的计时器
  • C++面向对象编程:类与对象详解
  • 【AI智能体】Spring AI MCP 从使用到操作实战详解
  • Caliper压力测试