Leetcode 039 组合总和 python

本人一直在努力地积累Leetcode上用Python实现的题,并且会尽力讲清每道题的原理,绝不像其他某些博客简略地带过。
如果觉得讲的清楚,欢迎关注。



最近一直有在坚持刷leetcode,写题解,目前到了二叉树那里,很多时候都不得不去看答案。但是我觉得这没有关系,一步步积累,仔细去分析为什么人家这样写,背后的思想是什么,我一定可以提高的。与各位一起共勉。


给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。 

示例 1:

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]

示例 2:

输入: candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]


这道题怪的地方在于同一个元素我可以想取多少遍就取多少遍。但这难不倒我们,换汤不换药,总体来说内核还是用DFS去解决。

当然这道题也不是那么死板,我们没必要说减少条件一定是target减少至0, 我们可以说当前和加起来等于target啊,只需要稍稍修改我们的逻辑即可。总的来说这道题难度不高,以下是详细代码解释,beat77

class Solution:
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        candidates.sort()
        #储存结果
        Solution.anslist = []
        self.DFS(candidates, target, 0, [])
        return Solution.anslist

    def DFS(self, candidates, target, start, valuelist):
        if target ==  0:
            return Solution.anslist.append(valuelist)
        for i in range(start, len(candidates)):
            #注意在我们的递归函数中,target是不断在变化的
            #因为每次我们调用递归都要用target减去candidates[i],所以这时候如果不保证target比较大,这一定不符合我们的要求
            if candidates[i] > target:
                return
            #递归时我们的减少的条件是target,每次它都会减少
            #如何做到题目说的一个数字可以多次取呢?
            #我们设置了一个start,它会保存上一次取的i,这一次可以继续取,如果符合条件的话
            self.DFS(candidates, target-candidates[i], i, valuelist+[candidates[i]])

猜你喜欢

转载自blog.csdn.net/weixin_41958153/article/details/80921589
今日推荐