LeetCode刷题复盘笔记——78. 子集 && 近期感悟复盘分享(一文搞懂回溯解决子集问题)

今日主要总结一下,78. 子集,通过本文可以搞懂子集问题和之前讲的组合和分割问题的区别
LeetCode刷题复盘笔记——77. 组合 && 216. 组合总和 III(一文搞懂回溯解决组合问题)

LeetCode刷题复盘笔记——40. 组合总和 II(一文搞懂回溯解决有重集合中结果去重的组合问题)

LeetCode刷题复盘笔记——17. 电话号码的字母组合(一文搞懂回溯解决多个集合中的组合问题)
LeetCode刷题复盘笔记——93. 复原 IP 地址(一文搞懂回溯解决把一长串数字字符串转换成IP地址问题)

LeetCode刷题复盘笔记——131. 分割回文串(一文搞懂回溯解决经典的分割回文串问题)

题目:78. 子集

Leetcode题目地址

题目描述:
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同

本题重难点

本题这是回溯法经典的子集题目。

根据题意可以看出来,子集比组合问题最后收集的结果要更多一些,包括[[]]空集合和题目所给集合本身也算在子集里面,而且同样要求不能重复。
一道回溯算法问题一般都可以抽象为一个树型结构,那就来看一下和之前的组合分割问题的区别:

在这里插入图片描述
从图中红线部分,可以看出遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合。

如果把子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

一、正确解法

C++代码

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    void backtracing(vector<int>& nums, int startIndex){
        res.push_back(path);
        if(startIndex >= nums.size()) return;
        for(int i = startIndex; i < nums.size(); i++){
            path.push_back(nums[i]);
            backtracing(nums, i + 1);
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        path.clear();
        res.clear();
        backtracing(nums, 0);
        return res;
    }
};

总结

虽然看代码发现子集问题还真挺简单,其实这就是一道标准的模板题。

但是做完这道题要清楚子集问题和组合问题、分割问题的的区别:

1. 子集是收集树形结构中树的所有节点的结果

2. 而组合问题、分割问题是收集树形结构中叶子节点的结果。


近期复盘感悟分享:

都说最快从一段感情走出来
要么是时间,要么是新欢
但……
其实最好不过是 明白
要知道每一次的恋爱
其实都是自己本性在对方身上的投影
人这一生
也都是在自己的缺点博弈
带着前任的印记与相处
不能说不公平
但要知道
每天清晨有多少双眼睛睁开
有多少人的意识苏醒过来
便有多少个世界

这段时间经常会想起她,
我其实知道我要见她不难,
但是后面我想了一个这样的事情,
我要去见的她和我所想的她是不是同一个她,

答案是,不是

后来我知道了:
和前任告别,是一场修行。
放弃最重要的人的感觉,
本就是一把大火烧了你住了很久的房子,
明知道那是你家,可你再也回不去了。
这是事实,虽然残忍但要去面对,
有些人终究只是陪你走一程,教会你成长。
不打扰,也许是最后能为她做的一件事。


我们要学会和自己的伤痛共处,
在这样一个阶段呢,
我可能不会过多地去和异性接触,
会先做好自己的事情,
调整好自己,
不断提升自己
不断充实丰富自己
让自己变得更好

希望我们在这场修行中都可以找到那个最真实的自己,

将那一轮明月赋予你真正最值得的人!

欢迎大家关注本人公众号:编程复盘与思考随笔

(关注后可以免费获得本人在csdn发布的资源源码)

公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al资料站与复盘笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值