90. 子集 II(LeetCode)(dfs)

子集 II

因为元素可能会重复,且要求输出的组合不能重复,所以不能像子集再使用二进制方式去枚举

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> path;

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        //按顺序选
        sort(nums.begin(), nums.end());

        dfs(nums, 0);

        return ans;
    }

    void dfs(vector<int>& nums, int u){
        if(u == nums.size()){
            ans.push_back(path);
            return;
        }
        int t = u + 1;
        while(t < nums.size() && nums[t] == nums[u]) ++t;
        //枚举选该元素多少个
        for(int i = 0; i <= t - u; ++i){
            //枚举下一段k,不含该段
            dfs(nums, t);
            //在枚举的过程中增加该元素个数
            path.push_back(nums[u]);
        }
        for(int i = 0; i <= t - u; ++i){
            path.pop_back();
        }   
    }
};
posted @ 2025-03-11 20:49  awei040519  阅读(9)  评论(0)    收藏  举报