zoukankan      html  css  js  c++  java
  • 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
     
    既然无论如何时间都会过去,为什么不选择做些有意义的事情呢
  • 相关阅读:
    DLL内存加载
    Intel汇编程序设计-高级过程(上)
    Intel汇编程序设计-高级过程(上)
    C#-常用
    C#-常用
    C#-MD5
    C#-MD5
    C#-文件操作
    POJ 3320 Jessica's Reading Problem
    POJ 2456 Aggressive cows
  • 原文地址:https://www.cnblogs.com/xiaodongsuibi/p/8988870.html
Copyright © 2011-2022 走看看