90. Subsets II

在这里插入图片描述

这道题写的时候有一些疑惑的地方,这里再记录一下

class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<vector<int>> ret;
        vector<int> temp;
        vector<bool> used(nums.size(), false);
        sort(nums.begin(), nums.end());
        helper(nums, ret, temp, used, 0);
        return ret;
    }
private:
    void helper(vector<int>& nums, vector<vector<int>>& ret, vector<int>& temp, vector<bool>& used, int idx) {
        ret.push_back(temp);
        for (int i = idx; i < nums.size(); ++i) {
            if (i > idx && nums[i] == nums[i-1] && !used[i-1])
                continue;
            used[i] = true;
            temp.push_back(nums[i]);
            helper(nums, ret, temp, used, i+1);
            temp.pop_back();
            used[i] = false;
        }
    }
};
//每一层递归代表在temp中的一个位置。比如[1,2,2],1和第一个2可以放在temp的第一个位置上,而第二个2不能够放上去。
//而i > idx而不是i > 0的原因是:要保证对于当前这个情况(前缀和当前位置),不可以有相同数字放在这儿,而不是连续的都不能用。

方法二:

class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<int> temp;
        vector<vector<int>> res;
        vector<bool> used(nums.size(), false);
        helper(nums, 0, temp, res, used);
        return res;
    }
private:
    void helper(vector<int>& nums, int idx, vector<int>& temp, vector<vector<int>>& res, vector<bool>& used) {
        if (idx == nums.size()) {
            res.push_back(temp);
            return;
        }
        helper(nums, idx+1, temp, res, used);
        if (!(idx > 0 && nums[idx] == nums[idx-1] && !used[idx-1])) {
            used[idx] = true;
            temp.push_back(nums[idx]);
            helper(nums, idx+1, temp, res, used);
            temp.pop_back();
            used[idx] = false;
        }
    }
};
posted @ 2019-10-12 10:22  于老师的父亲王老爷子  阅读(15)  评论(0)    收藏  举报