题目描述:
Combination Sum II
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:
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]
]
个人理解:
该问题就是给出一个数组,计算该数组的任意组合可以使得组合的和与target的值相等,数组的值不能重复
解题思路-dfs深度优先算法
首先为了简化问题,我们将数组进行排列,按从小到大进行排列。
dfs函数:分为三种情况
- 如果target=0,则说明path中已经得到了我们想要的值,则将path添加入我们的返回结果中。
- 如果小于-1,则说明目前的path值大于我们想要的值,则仅仅返回
- 对于第三种情况target>0比较复杂,我们需要将所有的candidates的值都尝试着添加进去path中,若dfs返回的值为-1,由于我们的数组是按从小到大的顺序排列,则说明该路径下再无合适的path,则返回上一层。
- 由于candidates之中存在重复的元素,对重复元素第一个遍历后,对于剩下的相同的元素再进行遍历则会添加重复的path,因此我们需要去重重复的path。
代码如下:
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
#print(candidates)
candidates.sort()
ret = []
self.dfs(candidates,target,[],ret)
return ret
def dfs(self,candidates,target,path,ret):
if target < 0 :
return -1
elif target == 0 :
ret.append(path)
return 0
else:
for i in range(len(candidates)):
if i>0 and candidates[i-1] == candidates[i]:
continue
if self.dfs(candidates[i+1:],target - candidates[i],path + [candidates[i]],ret) == -1:
break;