216.组合总和III
类比上一题,本题,n=9,k,加了个条件k个数的和为n
回溯三步曲
1.回溯参数和返回值 backtracking(targetsum, k, cursum, startindex,path,result) 返回值 void
2.终止条件: 节点达到k个或path元素和超过targetsum
3.单层搜索: 9个数,节点放到path,sum也要加上节点的值,别忘了处理过程 和 回溯过程是一一对应的,处理有加,回溯就要有减!
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
result = [] # 存放结果集
self.backtracking(n, k, 0, 1, [], result)
return result
def backtracking(self, targetSum, k, currentSum, startIndex, path, result):
if currentSum > targetSum: # 剪枝操作
return # 如果path的长度等于k但currentSum不等于targetSum,则直接返回
if len(path) == k:
if currentSum == targetSum:
result.append(path[:])
return
for i in range(startIndex, 9 - (k - len(path)) + 2): # 剪枝
currentSum += i # 处理
path.append(i) # 处理
self.backtracking(targetSum, k, currentSum, i + 1, path, result) # 注意i+1调整startIndex
currentSum -= i # 回溯
path.pop() # 回溯
17.电话号码的字母组合
回溯三步曲
1.回溯参数和返回值 backtracking(index【记录遍历到digit的第几个数字】, digit ,path,result) , 返回值 void
2.终止条件: path节点达到len(digit)个
3.单层搜索: 9个数,节点放到path,sum也要加上节点的值,别忘了处理过程 和 回溯过程是一一对应的,处理有加,回溯就要有减!
可以先画一个树状搜索图,横向是lettmap,读的这个数字对应的lettermap,竖着是树深度len(digits)
class Solution:
def __init__(self):
self.letterMap = [
"", # 0
"", # 1
"abc", # 2
"def", # 3
"ghi", # 4
"jkl", # 5
"mno", # 6
"pqrs", # 7
"tuv", # 8
"wxyz" # 9
]
def getCombinations(self, digits, index, s, result):
if index == len(digits):
result.append(s)
return
digit = int(digits[index]) #取数字
letters = self.letterMap[digit] #数字对应的lettermap
for letter in letters:
self.getCombinations(digits, index + 1, s + letter, result)
def letterCombinations(self, digits):
result = []
if len(digits) == 0: return result
self.getCombinations(digits, 0, "", result)
return result