当前位置:实例文章 » 其他实例» [文章]leetcode 39. 组合总和

leetcode 39. 组合总和

发布人:shili8 发布时间:2025-02-07 05:42 阅读次数:0

**组合总和**

给定一个非负整数数组 `candidates` 和一个目标整数 `target`,找出所有可能的组合总和,使得它们的总和等于 `target`。

**示例1:**

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

**示例2:**

输入:`candidates = [2,3,5]`, `target =8`
输出:`[[2,2,2,2],[2,3,3],[3,5]]`

**示例3:**

输入:`candidates = [2]`, `target =1`
输出:`[]`

**解决方案**

我们可以使用回溯法来解决这个问题。回溯法是一种递归的方法,用于遍历所有可能的组合。

class Solution:
 def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
 # 初始化结果列表 result = []
 # 定义一个函数来进行回溯 def backtrack(remain, comb, start):
 # 如果剩余值等于0,说明找到了一种组合方式 if remain ==0:
 result.append(list(comb))
 return # 遍历候选数字 for i in range(start, len(candidates)):
 # 如果当前数字大于剩余值,可以跳过 if candidates[i] > remain:
 break # 添加当前数字到组合中 comb.append(candidates[i])
 # 递归进行下一步 backtrack(remain - candidates[i], comb, i)
 # 回溯,移除最后添加的数字 comb.pop()
 # 开始回溯 backtrack(target, [],0)
 return result


**注释**

* `backtrack` 函数是递归函数,它负责进行回溯。
* `remain` 表示剩余值,`comb` 表示当前组合,`start` 表示候选数字的起始索引。
* 如果剩余值等于0,说明找到了一种组合方式,添加到结果列表中。
* 遍历候选数字,如果当前数字大于剩余值,可以跳过。
* 添加当前数字到组合中,并递归进行下一步。
* 回溯,移除最后添加的数字。

**测试**

solution = Solution()
print(solution.combinationSum([2,3,6,7],7)) # [[2,2,3],[7]]
print(solution.combinationSum([2,3,5],8)) # [[2,2,2,2],[2,3,3],[3,5]]
print(solution.combinationSum([2],1)) # []


**总结**

本题目要求找出所有可能的组合总和,使得它们的总和等于 `target`。我们使用回溯法来解决这个问题,定义一个函数 `backtrack` 来进行递归。测试结果表明我们的解决方案正确无误。

其他信息

其他资源

Top