leetcode 78.子集I
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int> nums,int startIndex){//1.确定函数的参数和返回值
//2.确定递归的终止条件
result.push_back(path);//放在终止条件的上方,否则会漏掉自己
// if(startIndex==nums.size()){终止条件可以加可以不加,因为如果startIndex==size,那么在下方for也会直接跳过然后下一步函数自动return;
// return;
// }
//3.确定递归的单层逻辑
for(int i=startIndex;i<nums.size();i++){
path.push_back(nums[i]);//3.1处理
backtracking(nums,i+1);//3.2递归
path.pop_back();//3.3回溯
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};
注意:
- 这里子集问题我们收集的是树上的所有节点,直接在每个回溯算法的开头不用if判断直接push进result即可
- 终止条件可以加可以不加,因为如果startIndex==size,那么在下方for也会直接跳过然后下一步函数自动return;
- 这里给我们的整数数组里面没有重复的元素,因此我们收集子集的时候一定不会有重复的结果,故我们往path里面添加数的时候不需要判断这个数之前是否添加过。