- 78.子集
- 思路:
子集也使用回溯,重点在于子集问题取的是树的所有节点,而组合问题和切割问题是叶子节点(通过某个终止条件结束,只收集叶子结点到结果集);
子集问题不需要任何剪枝,因为想要找的就是所有情况;
子集添加到结果集的操作有下面两种放法:
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void backtracking(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]);
backtracking(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums, 0);
return res;
}
};
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex) {
if (startIndex == nums.size()) return;
for (int i = startIndex; i < nums.size(); ++i) {
path.push_back(nums[i]);
res.push_back(path);
backtracking(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
res.push_back(path);
backtracking(nums, 0);
return res;
}
};
- 组合,切割都是收集某种终止条件下的叶子节点,而子集收集树的所有结点
- path添加进res的操作,需要不遗漏