216.组合总和III
本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,…,9]。本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。
思路:
1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要
- targetSum(int)目标和,也就是题目中的n。
- k(int)就是题目中要求k个数的集合。
- startIndex(int)为下一层for循环搜索的起始位置。
2.终止条件:len(path) == k and sum(path) == n,结束
3.遍历过程:本题和77. 组合 (opens new window)区别之一就是集合固定的就是9个数[1,…,9],所以for循环固定i<=9
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res = []
path = []
def backtrack(n, k, startIndex):
if sum(path) > n:
return
if len(path) == k and sum(path) == n:
res.append(path[:])
return res
for i in range(startIndex, 9 - (k-len(path))+2):
path.append(i)
backtrack(n, k, i+1)
path.pop()
backtrack(n, k, 1)
return res
17.电话号码的字母组合
本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,…,9]。本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。
思路:
1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要
- targetSum(int)目标和,也就是题目中的n。
- k(int)就是题目中要求k个数的集合。
- startIndex(int)为下一层for循环搜索的起始位置。
2.终止条件:len(path) == k and sum(path) == n,结束
3.遍历过程:本题和77. 组合 (opens new window)区别之一就是集合固定的就是9个数[1,…,9],所以for循环固定i<=9
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits:
return []
res = []
self.path = ''
phone_map = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'
}
def backtracking(digits,index):
if index == len(digits):
res.append(self.path[:])
return res
letters = phone_map[digits[index]]
for letter in letters:
self.path += letter
backtracking(digits, index+1)
self.path = self.path[:-1]
backtracking(digits, 0)
return res