这道题与之前做过的回溯问题最大的区别就是,我们在每一层递归都可以得到一个结果,也就是题目中所说的子集,而之前的题是在终止条件才将结果存入二维数组。需要注意的是,每一层递归中将结果存入二维数组的代码段需要放在终止条件之前。否则最后的子集还没存入就退出递归了。其他的部分都是之前的模版,我就不解释了,大家可以结合我下面的代码及详细注释理解此题。
代码及详细注释如下:
class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int start){//在每一层递归中都要收集子集result.push_back(path);//终止条件if(start >= nums.size()){return;}for(int i = start;i < nums.size();i++){path.push_back(nums[i]);backtracking(nums,i + 1);path.pop_back();}return;}vector<vector<int>> subsets(vector<int>& nums) {path.clear();result.clear();backtracking(nums,0);return result;}
};