题目
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
链接:https://leetcode.com/problems/combination-sum-iii/
Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Note:
- All numbers will be positive integers.
- The solution set must not contain duplicate combinations.
Example:
Input: k = 3, n = 7
Output: [[1,2,4]]
思路及代码
1. DFS
- 同39,40,78,90题
# 20ms
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
cur = []
ans = []
def dfs(target, start, length, cur, ans):
if length == 0:
if target == 0:
ans.append(cur.copy())
return
for i in range(start, 10):
if i > target:
return
cur.append(i)
dfs(target - i, i+1, length - 1, cur, ans)
cur.pop()
dfs(n, 1, k, cur, ans)
return ans
2. 位运算
- 同78题
- 很慢。。。可以忽略
# 376ms
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
cur = []
ans = []
for s in range(1 << 9):
sum = 0
for i in range(1 << 9):
if s & 1 << i:
sum += i+1
cur.append(i+1)
if len(cur) > k:
break
if sum == n and len(cur) == k:
ans.append(cur.copy())
cur = []
return ans
复杂度
T =
O
(
2
9
)
O(2^9)
O(29)
S =
O
(
k
)
O(k)
O(k) or
O
(
k
∗
m
)
O(k*m)
O(k∗m),m为可能的组合数