代码随想录算法训练营第二十六天(回溯算法篇)|39. 组合总和,40. 组合总和Ⅱ
2023-12-15 23:30:31
39. 组合总和
题目内容:给你一个?无重复元素?的整数数组?candidates
?和一个目标整数?target
?,找出?candidates
?中可以使数字和为目标数?target
?的 所有?不同组合?,并以列表形式返回。你可以按?任意顺序?返回这些组合。candidates
?中的?同一个?数字可以?无限制重复被选取?。如果至少一个数字的被选数量不同,则两种组合是不同的。?
思路:和之前的组合那道题不同点在于1. if条件不用要求path的长度,只要和相同,就返回,可以加上剪枝——当和大于target,直接返回。2. 递归时的起始值(startIdx)是i,不是i+1, 因为可以重复。
class Solution(object):
def traversal(self, result, path, sum, startIdx, candidates, target):
if sum > target:
return
if sum == target:
result.append(path[:])
return
for i in range(startIdx, len(candidates)):
path.append(candidates[i])
sum += candidates[i]
self.traversal(result, path, sum, i, candidates, target)
path.pop()
sum -= candidates[i]
return result
def combinationSum(self, candidates, target):
result = []
path = []
return self.traversal(result, path, 0, 0, candidates, target)
40. 组合总和Ⅱ
题目链接:40. 组合总和 II - 力扣(LeetCode)
题目难点:题目里给出的数组有重复元素,但要求答案里不能有重复组合.
思路:我们要对同一数层上重复使用的元素去重——前一个相同的元素要相加的数的范围大于后面那个元素家的范围,所以一定包含后一个元素找到的数。因此,我们可以对candidates进行排序,做for循环时只需判断当前元素和它前一个元素是否相同,若相同,就pass掉,对当前元素不做处理,继续跳到后一个数。
class Solution(object):
def traversal(self, result, path, sum, startIdx, candidates, target):
candidates = sorted(candidates)
if sum > target:
return
if sum == target:
result.append(path[:])
return
for i in range(startIdx, len(candidates)):
if candidates[i] == candidates[i-1]:
pass
path.append(candidates[i])
sum += candidates[i]
self.traversal(result, path, sum, i, candidates, target)
path.pop()
sum -= candidates[i]
return result
def combinationSum(self, candidates, target):
result = []
path = []
return self.traversal(result, path, 0, 0, candidates, target)
文章来源:https://blog.csdn.net/Huiwen18/article/details/135024555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!