给出两种去重的方法,其中第二种为官方方法,官方采用对每个值进行计数的方式去重。
class Solution:
def __init__(self):
self.res=[]
'''
去重的最好方法就是每一轮循环每个相同的元素只遍历一次
'''
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
for i in range(0,len(candidates)):
if i>0 and candidates[i]==candidates[i-1]:
continue
self.back(candidates,[],i,target)
return self.res
def back(self,candidates,tem_path,idx,remain):
if candidates[idx]==remain:
path=tem_path[:]
path.append(candidates[idx])
self.res.append(path)
return
remain-=candidates[idx]
tem_path.append(candidates[idx])
for i in range(idx+1,len(candidates)):
if i>idx+1 and candidates[i]==candidates[i-1]:
continue
if candidates[i]<=remain:
self.back(candidates,tem_path,i,remain)
else:
break
remain+=candidates[idx]
tem_path.pop()
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
def dfs(idx: int, rest: int):
nonlocal sequence
if rest == 0:
ans.append(sequence[:])
return
if idx == len(freq) or rest < freq[idx][0]:
return
dfs(idx + 1, rest)
# 最多可选的个数
most = min(rest // freq[idx][0], freq[idx][1])
for i in range(1, most + 1):
sequence.append(freq[idx][0])
dfs(idx + 1, rest - i * freq[idx][0])
sequence = sequence[:-most]
freq = sorted(Counter(candidates).items())
ans, sequence = [], []
dfs(0, target)
return ans
from typing import *
class Solution:
def __init__(self):
self.res = []
self.visited = None
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
self.visited = [False] * len(candidates)
candidates.sort()
self.back(candidates, [], 0, target)
return self.res
def back(self, candidates, tem_list, tem_sum, target):
if tem_sum == target:
self.res.append(tem_list[:])
return
for i in range(len(candidates)):
# 选择一个要添加的元素
if self.visited[i] or tem_sum + candidates[i] > target or (
i > 0 and candidates[i] == candidates[i - 1] and not self.visited[i - 1]) or (
len(tem_list) > 0 and candidates[i] < tem_list[-1]):
continue
tem_list.append(candidates[i])
self.visited[i] = True
self.back(candidates, tem_list, tem_sum + candidates[i], target)
self.visited[i] = False
tem_list.pop()