leetcode: 90. Subsets II

来源:互联网 发布:高腰西裤女淘宝 编辑:程序博客网 时间:2024/06/05 10:37

Q

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

[  [2],  [1],  [1,2,2],  [2,2],  [1,2],  []]

AC

class Solution(object):    def subsetsWithDup(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        self.result = set()        for i in range(len(nums)+1):            self.getCombi(nums, i,[])        return list(self.result)    def getCombi(self, nums, i, temp):        if i==0:            self.result.add(tuple(sorted(temp)))        elif not nums:            return        else:            self.getCombi(nums[1:], i-1, temp+[nums[0]])            self.getCombi(nums[1:], i, temp)# Time:  O(n * 2^n)# Space: O(1)class Solution2(object):    def subsetsWithDup(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        nums.sort()        result = [[]]        previous_size = 0        for i in xrange(len(nums)):            size = len(result)            for j in xrange(size):                # Only union non-duplicate element or new union set.                if i == 0 or nums[i] != nums[i - 1] or j >= previous_size:                    result.append(list(result[j]))                    result[-1].append(nums[i])            previous_size = size        return result# Time:  O(n * 2^n) ~ O((n * 2^n)^2)# Space: O(1)class Solution3(object):    def subsetsWithDup(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        result = []        i, count = 0, 1 << len(nums)        nums.sort()        while i < count:            cur = []            for j in xrange(len(nums)):                if i & 1 << j:                    cur.append(nums[j])            if cur not in result:                result.append(cur)            i += 1        return result# Time:  O(n * 2^n) ~ O((n * 2^n)^2)# Space: O(1)class Solution4(object):    def subsetsWithDup(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        result = []        self.subsetsWithDupRecu(result, [], sorted(nums))        return result    def subsetsWithDupRecu(self, result, cur, nums):        if not nums:            if cur not in result:                result.append(cur)        else:            self.subsetsWithDupRecu(result, cur, nums[1:])            self.subsetsWithDupRecu(result, cur + [nums[0]], nums[1:])if __name__ == "__main__":    assert Solution().subsetsWithDup([1, 2, 2]) == [(1, 2), (1,), (1, 2, 2), (2,), (), (2, 2)]


原创粉丝点击