小黑代码1
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
# 对数组进行排序,以便回溯
nums = sorted(nums)
# 数组长度
n = len(nums)
# 结果数组与中间变量
results = []
res = []
# 访问数组
flags = [False] * n
# 回溯函数
def dfs(i = 0):
# 递归出口
if i == n:
results.append(res[:])
return
# 没她
dfs(i + 1)
# 判断该元素在此位置是否被用过
if i > 0 and nums[i-1] == nums[i] and (not flags[i-1]):
return
# 有她
res.append(nums[i])
flags[i] = True
dfs(i + 1)
# 回溯
res.pop()
flags[i] = False
dfs()
return results
小黑代码2
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
# 对数组进行频率统计
items = list(collections.Counter(nums).items())
# 集合长度
n = len(items)
# 中间变量和结果数组
results = []
res = []
# 回溯函数
def dfs(i = 0):
if i == n:
results.append(res[:])
return
# 跳过该元素
dfs(i + 1)
# 不跳过
count = items[i][1]
for j in range(count):
res.append(items[i][0])
dfs(i + 1)
for j in range(count):
res.pop()
dfs()
return results
迭代法子集枚举
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
# 对数组进行排序
nums = sorted(nums)
# 数组长度
n = len(nums)
# 结果数组
results = []
# 开始枚举
for mask in range(1 << n):
# 中间变量
res = []
# 标记
flag = True
# 匹配元素
for i in range(n):
if (mask >> i) & 1:
# 判断上一个元素是否被用过
if i > 0 and nums[i-1] == nums[i] and not (mask >> (i-1) & 1):
flag = False
break
res.append(nums[i])
if flag:
results.append(res)
return results
小黑生活
晚餐煲仔饭
一个人的朝阳公园小怪兽
跑完吃两份烤冷面
睡前来个鸡尾酒
半程马拉松中签啦
肯德基早餐小笼包+柠檬水+油条+咖啡