class Solution:
def __init__(self):
self.path = []
self.res = []
def backtracking(self, targetSum, curSum, count, startIndex):
# 终止条件
if len(self.path) == count:
if curSum == targetSum:
self.res.append(self.path.copy())
return
for i in range(startIndex, 10):
self.path.append(i)
curSum += i
self.backtracking(targetSum, curSum, count, i+1) # 递归
curSum -= i # 回溯
self.path.pop()
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
self.backtracking(n, 0, k, 1)
return self.res
已选元素总和如果已经大于targetSum了,那么往后遍历就没有意义了,直接剪掉。
class Solution:
def __init__(self):
self.path = []
self.res = []
def backtracking(self, targetSum, curSum, count, startIndex):
# 终止条件
if len(self.path) == count:
if curSum == targetSum:
self.res.append(self.path.copy())
return
for i in range(startIndex, 10):
self.path.append(i)
curSum += i
if curSum > targetSum: # 剪枝
curSum -= i # 剪枝之前先把回溯做了
self.path.pop()
return
self.backtracking(targetSum, curSum, count, i+1) # 递归
curSum -= i # 回溯
self.path.pop()
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
self.backtracking(n, 0, k, 1)
return self.res
这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。
class Solution:
def __init__(self):
self.letterMap = [
'',
'',
'abc',
'def',
'ghi',
'jkl',
'mno',
'pqrs',
'tuv',
'wxyz'
]
self.string = []
self.res = []
def backtracking(self, digits, index):
# 终止条件
if index == len(digits):
self.res.append(''.join(self.string.copy()))
return
digit = int(digits[index])
for i in range(len(self.letterMap[digit])):
self.string.append(self.letterMap[digit][i])
self.backtracking(digits, index + 1)
self.string.pop() # 回溯
def letterCombinations(self, digits: str) -> List[str]:
if digits == "": return []
self.backtracking(digits, 0)
return self.res