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

力扣HOT100之回溯:78. 子集


这道题之前刷代码随想录的时候做过,现在又给忘完了,不过看了下自己当时写的博客,一下子就明白过来了,这道题收集的是组合结果,元素的排列顺序不重要,这与上一题46.全排列是不一样的,我们对比一下可以发现,全排列是在每一个叶子节点(触发递归终止条件)才收集结果,而对于这道题而言,我们并不是只有在叶子节点才收获结果,事实上,每向path数组中添加一个新的元素,我们就可以收获一次结果,那么我们怎么知道当前添加的这个元素在之前没有被统计过呢?我们需要借助一个变量start_index,在递归函数的主体部分,我们直接从下标为start_index的元素开始遍历,而start_index左侧的元素已经被统计过,不再考虑。
例如,对于输入[1, 2, 3]
我们先统计包含1的所有子集[1], [1, 2], [1, 2, 3], [1, 3]后,start_index应当更新为1,开始记录所有包含2的子集,由于元素1的下标为0,在后续的统计中不会被重复添加。
这样,我们在记录完所有子集后,一定不会重复,考虑到空集也是符合条件的子集,因此我们需要在递归函数彻底调用结束后及时添加一个空列表进去,然后再返回。

class Solution {
public:vector<vector<int>> result;   //用于保存所有的子集vector<int> path;     //记录每个子集vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums, 0);result.push_back({});   //添加空集return result;}void backtracking(vector<int>& nums, int start_index){//递归终止条件if(start_index >= nums.size())   //索引超出范围return ;//递归主体//start_index之前的元素已经添加过,不再考虑for(int i = start_index; i < nums.size(); i++){path.emplace_back(nums[i]);result.emplace_back(path);backtracking(nums, i + 1);path.pop_back();}}
};
http://www.xdnf.cn/news/8890.html

相关文章:

  • 【linux】systemct创建服务
  • 【C++】21. 红黑树的实现
  • 面试专栏04-SpringCloud
  • 相机内参 opencv
  • 基于Web组件实现随机抽奖
  • 云手机安卓12哪个好?掌派云手机安卓12系统上线,开启流畅体验新纪元
  • 指针数组和数组指针的区别
  • 华为OD机试真题—— 判断字符串子序列(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 【EcelVBA】系统学习 ActiveX 控件
  • 恒坤新材闯上市:利润受益于大额补贴,产能利用率低仍要募资扩产
  • OD 算法题 B卷【最长公共后缀】
  • C++修炼:哈希表的模拟实现
  • 【python实战】-- 选择解压汇总mode进行数据汇总20250525更新(篇幅2)
  • 塔能科技:以多元技术赋能全行业能耗节能转型
  • 力扣刷题(第三十七天)
  • Linux之概述和安装vm虚拟机
  • Oracle附加日志概述
  • Day 31 训练
  • 哪款云手机支持安卓12系统?掌派云手机-性价比之选
  • Threejs 透明模型渲染嵌套以及深度测试解决共存问题
  • 什么是ESLint?它有什么作用?
  • 10G/25G PCS only mode for CoaXPress Over Fiber
  • 9. Spring AI 各版本的详细功能与发布时间整理
  • 华为OD机试真题——出租车计费/靠谱的车 (2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Spring Cloud Sleuth与Zipkin深度整合指南:微服务链路追踪实战
  • Python实战:轻松连接与高效操作Elasticsearch
  • HDFS存储原理与MapReduce计算模型
  • 嵌入式学习笔记——day27
  • 奈雪小程序任务脚本
  • 计算机病毒的发展历程及其分类