LeetCode算法题90:子集 II解析

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

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

示例:

输入: [1,2,2]
输出:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

这个题与78题子集的解题思路基本一致,这里的数组可以包含重复元素,所以第一种集合添加元素扩充的方法需要添加约束,之前是遇到新元素所有的原来的子集都复制一份添加新元素,这里如果遇到新的元素是相同的,那么只添加到上次添加过的那些子集即可。递归方法则是遇到相同元素时需要跳过递归。这里说的都必须是排好序的数组。因此这里还需要先进行排序。

C++源代码:

class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        if(nums.empty()) return {};
        vector<vector<int>> res(1);
        sort(nums.begin(), nums.end());
        int last = nums[0], size = 1;
        for(int i=0;i<nums.size();i++){
            if(nums[i]!=last){
                last = nums[i];
                size = res.size();
            }
            int newSize = res.size();
            for(int j=newSize-size;j<newSize;j++){
                res.push_back(res[j]);
                res.back().push_back(nums[i]);
            }
        }
        return res;
    }
};
        

python3源代码:

class Solution:
    def subsetsWithDup(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        out = []
        nums.sort()
        n = len(nums)
        self.DFS(n, 0, nums, out, res)
        return res
    
    def DFS(self, n, level, nums, out, res):
        res.append(copy.deepcopy(out))
        i = level
        while i < n:
            out.append(nums[i])
            self.DFS(n, i + 1, nums, out, res)
            out.pop()
            while i+1 < n and nums[i]==nums[i+1]:
                i += 1
            i += 1

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/87826006