JZX轻语:简

LeetCode 39 & 216 & 377 - 组合总和相关问题

发表于2024年04月22日

#数组 #动态规划 #回溯

这三天的每日一题都是组合总和的问题:

题目39的做法:

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        ans = []

        def backtrack(cur_pos: int, arr: List[int], cur_sum: int):
            nonlocal candidates, ans
            if cur_sum == target:
                ans.append(list(arr))
            for next_pos in range(cur_pos, len(candidates)):
                next_sum = cur_sum + candidates[next_pos]
                if next_sum > target:
                    break
                arr.append(candidates[next_pos])
                backtrack(next_pos, arr, next_sum)
                arr.pop()
        
        candidates.sort()
        backtrack(0, [], 0)
        return ans

题目216的做法:

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        ans = []
        if (1 + k) * k // 2 > n:
            return ans

        def backtrace(cur_num: int, cur_sum: int, cur_arr: List[int]):
            nonlocal k, n
            if len(cur_arr) == k:
                if cur_sum == n:
                    ans.append(list(cur_arr))
                else:
                    return
            if cur_sum >= n:
                return
            for next_num in range(cur_num + 1, n + 1):
                cur_arr.append(next_num)
                backtrace(next_num, cur_sum + next_num, cur_arr)
                cur_arr.pop()

        backtrace(0, 0, [])
        return ans

题目377的做法:

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        dp = [0] * (target + 1)
        dp[0] = 1
        for sum_ in range(1, target + 1):
            for num in nums:
                if sum_ - num >= 0:
                    dp[sum_] += dp[sum_ - num]
        return dp[target]

闪念标签:LC