当前位置: 代码迷 >> 综合 >> leetcode-40题
  详细解决方案

leetcode-40题

热度:73   发布时间:2024-02-22 07:55:17.0

题目描述:

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 retdef dfs(self,candidates,target,path,ret):if target < 0 :return -1elif target == 0 :ret.append(path)return 0else:for i in range(len(candidates)):if i>0 and candidates[i-1] == candidates[i]:continueif self.dfs(candidates[i+1:],target - candidates[i],path + [candidates[i]],ret) == -1:break;