今日主要总结一下,78. 子集,通过本文可以搞懂子集问题和之前讲的组合和分割问题的区别
LeetCode刷题复盘笔记——77. 组合 && 216. 组合总和 III(一文搞懂回溯解决组合问题)
LeetCode刷题复盘笔记——40. 组合总和 II(一文搞懂回溯解决有重集合中结果去重的组合问题)
LeetCode刷题复盘笔记——17. 电话号码的字母组合(一文搞懂回溯解决多个集合中的组合问题)
LeetCode刷题复盘笔记——93. 复原 IP 地址(一文搞懂回溯解决把一长串数字字符串转换成IP地址问题)
LeetCode刷题复盘笔记——131. 分割回文串(一文搞懂回溯解决经典的分割回文串问题)
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 中的所有元素 互不相同
本题这是回溯法经典的子集题目。
根据题意可以看出来,子集比组合问题最后收集的结果要更多一些,包括[[]]空集合和题目所给集合本身也算在子集里面,而且同样要求不能重复。
一道回溯算法问题一般都可以抽象为一个树型结构,那就来看一下和之前的组合分割问题的区别:
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;
}
};
虽然看代码发现子集问题还真挺简单,其实这就是一道标准的模板题。
近期复盘感悟分享:
都说最快从一段感情走出来
要么是时间,要么是新欢
但……
其实最好不过是 明白
要知道每一次的恋爱
其实都是自己本性在对方身上的投影
人这一生
也都是在自己的缺点博弈
带着前任的印记与相处
不能说不公平
但要知道
每天清晨有多少双眼睛睁开
有多少人的意识苏醒过来
便有多少个世界
这段时间经常会想起她,
我其实知道我要见她不难,
但是后面我想了一个这样的事情,
我要去见的她和我所想的她是不是同一个她,
答案是,不是
后来我知道了:
和前任告别,是一场修行。
放弃最重要的人的感觉,
本就是一把大火烧了你住了很久的房子,
明知道那是你家,可你再也回不去了。
这是事实,虽然残忍但要去面对,
有些人终究只是陪你走一程,教会你成长。
不打扰,也许是最后能为她做的一件事。
我们要学会和自己的伤痛共处,
在这样一个阶段呢,
我可能不会过多地去和异性接触,
会先做好自己的事情,
调整好自己,
不断提升自己
不断充实丰富自己
让自己变得更好
希望我们在这场修行中都可以找到那个最真实的自己,
将那一轮明月赋予你真正最值得的人!
欢迎大家关注本人公众号:编程复盘与思考随笔
(关注后可以免费获得本人在csdn发布的资源源码)
公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!