欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

回溯-LeetCode39. 组合总和

程序员文章站 2022-04-03 10:15:18
1、题目描述https://leetcode-cn.com/problems/combination-sum/给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。所有数字(包括 target)都是正整数。 解集不能包含重复的组合。输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7], [2,......

1、题目描述

https://leetcode-cn.com/problems/combination-sum/

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

  • candidates 中的数字可以无限制重复被选取。
  • 所有数字(包括 target)都是正整数。 解集不能包含重复的组合。
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[[7],
 [2,2,3]]

输入:candidates = [2,3,5], target = 8,
所求解集为:
[[2,2,2,2],
 [2,3,3],
 [3,5]]
  • 1 <= candidates.length <= 30
  • 1 <= candidates[i] <= 200
  • candidate 中的每个元素都是独一无二的。
  • 1 <= target <= 500

2、代码详解

https://leetcode-cn.com/problems/combination-sum/solution/hui-su-jian-zhi-jian-zhi-hou-9394zhu-xing-jie-shi-/

class Solution:
    def combinationSum(self, candidates, target):
        if not candidates:
            return []
        n = len(candidates)
        res = []
        candidates.sort()

        def helper(i, tmp, target):  # 下一加和索引i,当前已加和数组tmp,下一目标target
            # 若target==0,说明当前和满足条件,将当前加和数组tmp加入res,并return
            if target == 0:
                res.append(tmp)
                return
            # 剪枝 因为已经将candidates排序,所以当下一目标小于下一待加和数时,return。
            # 并且当下一待加和索引i==n时,return。
            # 为了防止数组越界,将条件i==n放在target<candidates[i]之前,进行截断。
            if i == n or target < candidates[i]:
                return

            helper(i, tmp + [candidates[i]], target - candidates[i])  # 因为可重复调用元素,继续重复调用自身。
            helper(i + 1, tmp, target)  # 调用数组中下一元素,寻找新答案

        helper(0, [], target)
        return res

https://leetcode-cn.com/problems/combination-sum/solution/xue-yi-tao-zou-tian-xia-hui-su-suan-fa-by-powcai/

本文地址:https://blog.csdn.net/IOT_victor/article/details/107646185

相关标签: 回溯 Array