想起来11月被华为机试干掉的那一天...子集划分题考场上已经想到回溯+DP但是回溯写不起来饮恨当场...
这次刷完去把几题回溯+DP的题过一遍...
加深印象!!!
77. 组合
回溯模板题
注意剪枝逻辑。
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
res = []
def dfs(i, path):
if len(path) == k:
res.append(path[:])
return
for j in range(i, n + 1 - k + len(path) + 1):
path.append(j)
dfs(j + 1, path)
path.pop()
dfs(1, [])
return res
216.组合总和III
注意剪枝逻辑。
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
if n < k * (k - 1) // 2 or n > k * (19 - k) // 2:
return []
res = []
path = []
def dfs(start, target):
if target < 0:
return
if len(path) == k and target == 0:
res.append(path.copy())
return
for i in range(start, 10 - k + len(path)):
path.append(i + 1)
dfs(i + 1, target - i - 1)
path.pop()
dfs(0, n)
return res
17.电话号码的字母组合
递归回溯就是探查-撤销每个电话号码;
for循环就是遍历每个电话号码的字母。
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
dial = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'
}
l = len(digits)
res = []
def dfs(path, i):
if len(path) == l:
res.append(path)
return
for j in range(len(dial[digits[i]])):
dfs(path + dial[digits[i]][j], i + 1)
if digits:
dfs('', 0)
return res
909

被折叠的 条评论
为什么被折叠?



