Leetcode039 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]
]

解题思路:

利用动态规划和递归的思想来解题

  • 首先要将目标数组进行排序,然后使用函数combinationSum_solve()来解题
  • 在函数combinationSum_solve()中,candidates代表目标数组,target表示目标数,start表示遍历目标数组的开始位置,如果已经遍历过的数字,则start自动往后移动,valuelist用来存储满足题目要求的数字
  • 遍历的过程就是看当前数字是否比target小,如果是,则添加入valuelist,然后继续遍历,此时开始位置为当前位置,此时的target变成target - candidates[i],即开始找有没有与valuelist中数字可以相加等于target的数字

Python源码:

from typing import List


class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort()
        Solution.analist = []
        self.combinationSum_solve(candidates, target, 0, [])
        return Solution.analist

    def combinationSum_solve(self, candidates, target, start, valuelist):
        if target == 0:
            return Solution.analist.append(valuelist)
        for i in range(start, len(candidates)):
            if candidates[i] > target:
                return
            self.combinationSum_solve(candidates, target - candidates[i], i, valuelist + [candidates[i]])
        

欢迎关注我的github:https://github.com/UESTCYangHR

猜你喜欢

转载自blog.csdn.net/dzkdyhr1208/article/details/89329351