216.组合总和III
力扣链接
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
思路
在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。
k相当于深度,9相当于宽度
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res = []
self.backtracking(n,k,0,1,[],res)
return res
def backtracking(self, targetsum, k, currentSum, startIndex, path, res):
if len(path)==k:# 终止条件,找到k个数的组合了
if currentSum == targetsum:
res.append(path[:])
return
for i in range(startIndex, 10):
currentSum += i
path.append(i)
self.backtracking(targetsum, k, currentSum, i+1, path, res)
currentSum -= i #回溯
path.pop() # 回溯,撤销处理的节点
17.电话号码的字母组合
力扣链接
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
思路
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
]
self.result = []
self.s = ""
def backtracking(self, digits, index):
if index == len(digits):
self.result.append(self.s)
return
digit = int(digits[index]) # 将索引处的数字转换为整数
letters = self.letterMap[digit] # 获取对应的字符集
for i in range(len(letters)):
self.s += letters[i] # 处理字符
self.backtracking(digits, index + 1) # 递归调用,注意索引加1,处理下一个数字
self.s = self.s[:-1] # 回溯,删除最后添加的字符
def letterCombinations(self, digits):
if len(digits) == 0:
return self.result
self.backtracking(digits, 0)
return self.result