这个和第一个子集不同的地方是数组中存在重复元素,仍然使用回溯法。将原始的数据排序,仍然使用第一个子集题的代码,只是每次在加入到res数组时判断数组中是否已经包括了这个子集,但是这种判断操作比较费时,在leedcode尝试过。我们使用另外一种判断方式,就是如果当前的元素和前一个元素是相同的,那么就跳过,没有比较计算以当前元素开头的子集,因为在上一个元素开头的子集中一定已经包含了这些子集。重点还是要理解回溯法的运行机制,就会一目了然。
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
n = len(nums)
if n > 0:
nums.sort()
def helper(i, tmp):
#if tmp not in res:
res.append(tmp)
for j in range(i, n):
if j > i and nums[j] == nums[j - 1]:
continue
helper(j + 1, tmp + [nums[j]])
helper(0, [])
return res