53. 数字组合 II

153. 数字组合 II

中文English

给定一个数组 num 和一个整数 target. 找到 num 中所有的数字之和为 target 的组合.

样例

样例 1:

输入: num = [7,1,2,5,1,6,10], target = 8
输出: [[1,1,6],[1,2,5],[1,7],[2,6]]

样例 2:

输入: num = [1,1,1], target = 2
输出: [[1,1]]
解释: 解集不能包含重复的组合

注意事项

  1. 在同一个组合中, num 中的每一个数字仅能被使用一次.
  2. 所有数值 (包括 target ) 都是正整数.
  3. 返回的每一个组合内的数字必须是非降序的.
  4. 返回的所有组合之间可以是任意顺序.
  5. 解集不能包含重复的组合.
输入测试数据 (每行一个参数)如何理解测试数据?

 for循环内嵌dfs + curindex + 1不取重 + 判断存在 

class Solution:
    """
    @param num: Given the candidate numbers
    @param target: Given the target number
    @return: All the combinations that sum to target
    """
    def combinationSum2(self, num, target):
        # write your code here
        
        num.sort()
        results = []
        #递归的调用
        self.dfs(results, target, 0, num, [])
        return results 
    
    #递归的定义,传入参数
    #第一个参数表示的是结果,results
    #第二个是剩余目标
    #第三个是当前索引
    #第四个是num
    #第五个是当前的array
    def dfs(self, results, remaintarget, curindex, num, array):
        #递归的出口,如果是剩余目标已经是小于0的话,则直接返回
        if remaintarget < 0:
            return 
        
        #如果是符合条件
        if remaintarget == 0:
            #list(array)深拷贝,不会和上一个指向同一个内存地址,results此时已经改变了
            if (list(array) not in results):
                results.append(list(array))
            return 
    
        #递归的拆解
        for i in range(curindex, len(num)):
            array.append(num[i])
            #如果当前值已经被用了的话,当前索引加1就好了,就不会被再次被取用
            self.dfs(results, remaintarget - num[i], i + 1, num, array)
            array.pop()

 

posted @ 2020-08-02 14:18  风不再来  阅读(93)  评论(0编辑  收藏  举报