leetcode78.子集

 

 

编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。

说明:解集不能包含重复的子集。

示例:输入: nums = [1,2,3]

输出:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
方法一(组合问题常用模板):
class Solution {
    vector<vector<int>> res;
    vector<int> tmp;
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        generate(0, nums);
        return res;
    }
    
    void generate(int i, vector<int>& nums) {
        res.push_back(tmp);
        
        for(int j = i; j < nums.size(); ++j) {
            tmp.push_back(nums[j]);
            generate(j+1, nums);
            tmp.erase(tmp.end()-1);
        }
    }
};

方法二:

思路:对于[1,2,3]集合,按顺序遍历每个元素,每一步只需考虑加还是不加当前元素。

class Solution {
    vector<int> tmp;
    vector<vector<int>> res;
public:
    void backtrack(int i, vector<int>& nums)
    {
        if(i >= nums.size()) return;
        tmp.push_back(nums[i]); //加入当前元素
        res.push_back(tmp);
        backtrack(i+1, nums);
        tmp.pop_back();     //不加入当前元素
        backtrack(i+1, nums);
    }
    vector<vector<int>> subsets(vector<int>& nums)
    {
        res.push_back(tmp);//先把空集加进去
        backtrack(0, nums);
        
        return res;
    }
};

 

posted @ 2020-06-09 22:07  Joker1937  阅读(165)  评论(0编辑  收藏  举报