【力扣】78.子集

AC截图

题目

思路

维护一个集合tmp,用于记录目前的子元素

    for (int i = start; i < nums.size(); ++i) {
        subset.push_back(nums[i]);
        backtrack(nums, result, subset, i + 1);
        subset.pop_back();
    }
}
  • 遍历从startnums.size()的所有元素,尝试将每个元素加入当前子集。

  • 使用push_back做出选择,然后递归调用backtrack处理剩余的元素。

  • 使用pop_back撤销选择,以便尝试不加入当前元素的情况。

代码

class Solution {
public:
    void backtrack(vector<vector<int>>& res,vector<int>& nums,vector<int>& tmp,int first){
        res.emplace_back(tmp);

        for(int i=first;i<nums.size();i++){
            tmp.push_back(nums[i]);
            backtrack(res,nums,tmp,i+1);
            tmp.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> tmp;
        backtrack(res,nums,tmp,0);
        return res;
    }
};