也是回溯问题,可以先把题目抽象成一棵二叉树。
回溯三部曲:
1、函数参数
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex);
2、终止条件
result.push_back(path);//刚切下去的数,就得拿走
if (startIndex >= nums.size()) {
/*result.push_back(path);这里插入的话,只会接收最后一行的子集,但是我们保留的是每一次切割的子集*/
return;
}
3、单层逻辑
for (int i = startIndex; i < nums.size(); i++) {
path.push_back(nums[i]);
backtracking(nums, i + 1);
path.pop_back();
}
完整代码
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex) {
result.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) {
result.clear();
path.clear();
backtracking(nums, 0);
return result;
}
};
注意:终止条件那里,需要注意什么时候插入子集。而且单层逻辑那里就可以判断条件终止,所以条件终止可以省略。