LeetCode Medium: 40. 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 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]
]

 

题意:与上一道题相似,不同的是这道题数组中的数字只能使用一次。
二、思路
 每一个数字在使用后都做一次标记 flaglist,使用后置 1 ,在一次递归过程中遇到 flaglist 为 1的时候就跳过;还有就是如果给定的数组就是带有重复的,那么在排序后相同的数字肯定是近邻着的,这时候在递归的时候需要做一些处理。
三、代码
#utf-8
class Solution:
    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        self.reList = []
        f1 = [0]*len(candidates)
        candidates = sorted(candidates)
        self.dfs(candidates, [], target, f1,0)
        print(self.reList)
        return self.reList

    def dfs(self,candidates,sublist,target,flaglist,last):
        if target == 0:
            self.reList.append(sublist[:])
        if target < candidates[0]:
            return
        l = None  #为了防止重复的比如两个1,那么一层递归只处理一次
        for m in range(len(candidates)):
            n = candidates[m]
            if n > target:
                return
            if n < last or flaglist[m] == 1 or l == n:
                #三种情况:1、因为是从小到大,所以n开始要从上一个数以后;2、如果已经使用过,那就继续;3、如果在这一层递归的时候比如有两个1,那之前做一次1的时候,第二次就不处理了,不然就会重复
                continue
            sublist.append(n)
            flaglist[m]=1
            self.dfs(candidates,sublist,target-n,flaglist,n)
            flaglist[m]=0
            l = n
            sublist.pop()

if __name__ == '__main__':
    candidates = [2,4,3,1,1]
    target = 5
    ss = Solution()
    ss.combinationSum2(candidates,target)

  

 
 
 
 
 
参考博客:https://blog.csdn.net/zl87758539/article/details/51693549
 

猜你喜欢

转载自www.cnblogs.com/xiaodongsuibi/p/8988870.html