适合用回溯进行完成的task:
1. 组合
2. 切割
3. 子集
4. 排列
5. 棋盘
模版通常
def backtracking(参数):
if 终止条件:
收集结果
return
for (集合元素):
处理节点
递归函数
回溯, 撤销处理结果
return
77. Combinations
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
self.path = []
self.res = []
def backtracking(n, k, start_index):
if len(self.path) == k:
self.res.append(self.path[:])
return
for i in range(start_index,n + 1):
self.path.append(i)
backtracking(n, k, i + 1)
self.path.pop()
backtracking(n, k, 1)
return self.res
216. Combination Sum III
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
self.sum = 0
self.path = []
self.res = []
def backtracking(k, n, start_index = 1):
if self.sum > n or len(self.path) > k:
return
if self.sum == n and len(self.path) == k:
self.res.append(self.path[:])
return
for i in range(start_index, 10):
self.sum += i
self.path.append(i)
backtracking(k, n, i + 1)
self.sum -= i
self.path.pop()
return
backtracking(k, n)
return self.res
17. Letter Combinations of a Phone Number
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
letterMap = [
"", # 0
"", # 1
"abc", # 2
"def", # 3
"ghi", # 4
"jkl", # 5
"mno", # 6
"pqrs", # 7
"tuv", # 8
"wxyz" # 9
]
self.path = []
self.res = []
if digits == "":
return []
def backtracking(digits, start_index):
if len(self.path) == len(digits):
self.res.append(''.join(self.path))
return
for letter in letterMap[int(digits[start_index])]:
self.path.append(letter)
backtracking(digits, start_index + 1)
self.path.pop()
return
backtracking(digits, 0)
return self.res