LeetCode 216. 组合总和 III
216. 组合总和 III
Difficulty: 中等
找出所有相加之和为 n 的 _k _个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
Solution
组合求和系列题目的第三题,回顾第39题和第40题提到的解题框架:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
回答两个问题:1. 递归什么时候结束?2. 元素是可以被重复使用的还是不可以被重复使用的?
- 数组内元素每次被使用之后,
target
减去该元素,直到target
被减到0,说明找到了满足和为target
的组合;并且组合的长度等于k
- 数组内的元素不重复,并且组合中不存在重复的数字,说明元素不能被重复使用
回答两个问题之后就能开心写出答案了,一次AC。
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
candidates = [i+1 for i in range(9)]
res = []
self.dfs(candidates, [], n, k, res, 0)
return res
def dfs(self, nums, path, target, k, res, start):
if target < 0:
return
if target == 0 and len(path) == k:
res.append(path[:])
return
for i in range(start, len(nums)):
path.append(nums[i])
self.dfs(nums, path, target-nums[i], k, res, i+1)
path.pop()