子集,子集 II

79 阅读1分钟

子集

[题目](78. 子集)

代码实现

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int> & nums, int startIndex) {
        // 收集子集,要放在终止条件的上面,否则会漏掉自己
        result.push_back(path);
        if (startInde >= 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) {
        backtracking(nums, 0);
    }
};

子集 II

[题目](90. 子集 II)

重点

需要去重

代码实现

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int> & nums, int startIndex) {
        result.push_back(path);
        unordered_set<int> uset;
        for(int i = startIndex; i < nums.size(); i++) {
            if (uset.find(nums[i]) != uset.end()) {
                continue;
            }
            uset.insert(nums[i]);
            path.push_back(nums[i]);
            backtracking(nums, startIndex + 1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        // 去重需要排序
        sort(nums.begin(), nums.end());
        backtracking(nums, 0);
    }
};