第七章 回溯(二)
主要内容
- 相同集合之间组合
- 不同集合之间组合
题目
216. 组合总和 III
思路分析
注意剪枝
代码
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res = []
path = []
def backtracking(k, n, start):
# 剪枝
if sum(path) > n:
return
if len(path) == k:
if sum(path) == n:
res.append(path[:])
return
for i in range(start, 10 - (k - len(path)) + 1):
path.append(i)
backtracking(k, n, i + 1)
path.pop()
backtracking(k, n, 1)
return res
17.电话号码的字母组合
思路分析
注意这里的for循环for c in d[digits[index]]
是不同集合之间的组合
代码
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
d = {
'2':"abc",
'3':"def",
'4':"ghi",
'5':"jkl",
'6':"mno",
'7':"pqrs",
'8':"tuv",
'9':"wxyz"
}
res = []
path = []
n = len(digits)
if n == 0:
return res
def backtracking(digits,index):
# index指向digits的下标索引
if index == n:
res.append("".join(path))
return
for c in d[digits[index]]:
path.append(c)
backtracking(digits,index + 1)
path.pop()
backtracking(digits, 0)
return res