135. 数字组合

135. 数字组合

中文English

给定一个候选数字的集合 candidates 和一个目标值 target. 找到 candidates 中所有的和为 target 的组合.

在同一个组合中, candidates 中的某个数字不限次数地出现.

样例

样例 1:

输入: candidates = [2, 3, 6, 7], target = 7
输出: [[7], [2, 2, 3]]

样例 2:

输入: candidates = [1], target = 3
输出: [[1, 1, 1]]

注意事项

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

 for循环内嵌dfs + 排序 + 去重

class Solution:
    """
    @param candidates: A list of integers
    @param target: An integer
    @return: A list of lists of integers
    """
    def combinationSum(self, candidates, target):
        # write your code here
        #for循环里面内嵌dfs写法 + 排序 + 去重
        
        results = []
        candidates.sort()
#递归的调用 self.dfs(results, [], 0, candidates, target)
return results #递归的定义 #传入参数 def dfs(self, results, array, curindex, candidates, remaintarget): #递归的出口,如果remaintarget小于0的时候,返回,继续下一次的寻找 if (remaintarget < 0): return #如果符合条件,remaintarget == 0,则加进results里面 if (remaintarget == 0): #注意:如果是append(array)是浅拷贝,只拷贝指针,不拷贝数据,array改变,上一个array指向的也是同样内存地址。list或者arrar[:]是深拷贝,拷贝指针也会拷贝数据进来 results.append(list(array)) return results #递归的拆解,for循环里面内嵌dfs写法 for i in range(curindex, len(candidates)): #去重处理,如果当前索引不同,但是值相同,则说明是重复的 if (i != 0) and (candidates[i] == candidates[i - 1]): continue array.append(candidates[i]) #不停的dfs,直到remaintarget==0或者< 0的时候返回 self.dfs(results, array, i, candidates, remaintarget - candidates[i]) #如果返回了,则开始往回移除值,一个一个移除在进行判断是否符合 array.pop()

 

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