Leetcode 39. Combination Sum 组合总和
标签: Leetcode
题目地址: https://leetcode-cn.com/problems/combination-sum/
题目描述
给定一个无重复元素的数组 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传入到递归中,每次把target减去递归到的数值,那么边界就是target与0作比较,如果小于0,则说明没找到,return,如果等于0 ,说明是一个解,其他情况则继续进行递归遍历,而每次递归我们的候选值是从所有candidates里面选择任何一个,所以需要一个for循环。那么递归设计就完成了。其实所有dfs的代码都非常的像,但是有时候解释性又不是很好,所以记着这个套路,会用即可,典型的比如全排列问题。
python代码
import copy
class Solution(object):
def dfs(self,start,candidates,target,out,res):
# 不满足条件
if target<0:
return
# 刚好满足
if target ==0:
res.append(copy.copy(out))
# 从start开始遍历一遍,由于可以多个,所以是从start
for i in range(start,len(candidates)):
out.append(candidates[i])
self.dfs(i,candidates,target - candidates[i],out,res)
out.remove(candidates[i])
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
res = []
out = []
candidates = sorted(candidates)
self.dfs(0,candidates,target,out,res)
return res
本文介绍了解决LeetCode39题——组合总和的递归算法思路及Python实现。通过深度优先搜索(DFS)的方式,在给定的无重复元素数组中寻找所有可能的组合,使得这些组合的元素之和等于目标数。
1106

被折叠的 条评论
为什么被折叠?



