组合总和II
Description
- Combination Sum II Medium
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:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
Example
- 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]
]
题意
从有重复元素的候选列表中找到元素和为target的所有组合
要求候选列表中的所有元素只能用一次
解题思路
这题跟39.Combination Sum思路差不多,用dfs即可求解,注意题目要求元素只能使用一次,那么列表排序后[1,1,2,5,6,7,10]如果开始选择1,target为9后面可以选择[1,2,5,6,7,10];再选择1后面可以选择[2,5,6,7,10],以此类推,如果不满足条件则退回上一次选择。所以这里能够选择的范围是index后面的数,不包括index本身。
code
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
res = []
self.dfs(candidates, target, 0, res, [])
return res
def dfs(self, nums, target, index, res, path):
if target < 0:
return
elif target == 0:
res.append(path)
return
for i in range(index, len(nums)):
if i > index and nums[i] == nums[i-1]:
continue
self.dfs(nums, target-nums[i], i+1, res, path+[nums[i]])