剑指 Offer II 084. 含有重复元素集合的全排列
小黑代码
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
# 结果数组与中间变量
results = []
res = []
# 对数组进行排序,便于回溯
nums = sorted(nums)
# 数组长度
n = len(nums)
# 访问数组
flags = [False] * n
# 回溯函数
def dfs(i = 0):
# 递归出口
if i == n:
results.append(res[:])
return
for j in range(n):
# 判断该元素是否被访问
if flags[j]:
continue
# 如果紧邻两个元素相同,判断上一个是否被使用过,如果未被使用,证明该位置已经放过该元素
if j > 0 and nums[j-1]==nums[j] and not flags[j-1]:
continue
res.append(nums[j])
flags[j] = True
dfs(i + 1)
res.pop()
flags[j] = False
dfs()
return results
剑指 Offer II 082. 含有重复元素集合的组合
小黑代码
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
# 对数组中的每个元素进行计次,按照元素大小排序
items = list(collections.Counter(candidates).items())
items.sort(key = lambda x:x[0])
# 集合的长度
n = len(items)
# 结果数组与中间变量
results = []
res = []
self.sum = 0
# 回溯函数
def dfs(i = 0):
if self.sum == target:
results.append(res[:])
return
if i == n:
return
if self.sum + items[i][0] <= target:
count = min((target - self.sum) // items[i][0], items[i][1])
# 分别列举每个次数
for _ in range(count):
res.append(items[i][0])
self.sum += items[i][0]
dfs(i + 1)
# 回溯
for _ in range(count):
res.pop()
self.sum -= items[i][0]
# 不存放该元素的情况
dfs(i + 1)
dfs()
return results
小黑生活
晚饭板面
回去完练琴拍拍辅导员
睡前吃个牛排
早上笔试两小时
中午继续吃牛排
吃完去永定门外搓个澡汗个蒸