本人一直在努力地积累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]])