Given a collection of candidate numbers (candidates
) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
Each number in candidates
may only be used once in the combination.
Note:
target
) will be positive integers.Example 1:
Input: candidates =[10,1,2,7,6,1,5]
, target =8
, A solution set is: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
Example 2:
Input: candidates = [2,5,2,1,2], target = 5, A solution set is: [ [1,2,2], [5] ]
跟上一道题类似,只是这里每个数只能用一次,所以每次探索的时候我们都往下进一步,而不是像上一道题一样还在原位置尝试一下,其实就是把start改成了start+1.
注意这里要解决一个重复的问题,以 [10,1,2,7,6,1,5],8 为例,排序后是[1, 1, 2, 5, 6, 7, 10],当第一个1探索完了之后,第二个1已经没有必要探索了:
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
tmp=[]
res=[]
candidates=sorted(candidates)
def find(start,t):
if t<0:
return
if t==0:
res.append(tmp.copy())
else:
i=start
while istart and candidates[i]==candidates[i-1]:
i+=1
continue
tmp.append(candidates[i])
i += 1
find(i, t-candidates[i-1])
tmp.pop()
find(0,target)
return res
能看到while循环开始的地方有一点判断,以第一个1开始的所有结果都探索完了,现在start=0,i=1,循环里探索的是从第二个1开始的,需要跳过。