一、组合总和 III
1.1 题目
找出所有相加之和为 n
的 k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
输入: k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他符合的组合了。
示例 2:
输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]] 解释: 1 + 2 + 6 = 9 1 + 3 + 5 = 9 2 + 3 + 4 = 9 没有其他符合的组合了。
示例 3:
输入: k = 4, n = 1 输出: [] 解释: 不存在有效的组合。 在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。
提示:
2 <= k <= 9
1 <= n <= 60
1.2 题目链接
1.3 解题思路和过程想法
(1)解题思路
典型的同逻辑处理暴力枚举不确切层次的题目,用递归实现。
# 递归出口:已处理的路径长度等于 k ,并且累加和为 n
# 处理逻辑:for 语句实现横向遍历(所有数字),递归语句实现纵向遍历(找到 k 个值)
# 递归函数的参数:路径长度 k ,累加和 n ,当前递归的开始位置,当前的累加和 summ,全局变量:已遍历的路径 path、最终结果 res
递归和回溯的内在运行过程:如果没有达到终止条件,则直接添加数字 path.append(i);若达到终止条件,则保存结果,然后回溯,弹出路径 path 的最后一个结果;本轮 i 完成所有遍历后,会在最后回溯时依次弹出 path 中的所有元素,然后开始下一轮 i + 1。
(2)过程想法
典型的组合问题,多体会回溯的过程。
1.4 代码
class Solution:
def backTracing(self,k,n,startIndex,summ,path,res):
# 终止条件
if k == len(path) :
if n == summ:
res.append(path[:])
return
# 递归
for i in range(startIndex,9-k+len(path)+2):
summ += i
path.append(i)
self.backTracing(k,n,i+1,summ,path,res)
summ -= i
path.pop()
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res = []
self.backTracing(k,n,1,0,[],res)
return res
二、电话号码的字母组合
2.1 题目
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "" 输出:[]
示例 3:
输入:digits = "2" 输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
2.2 题目链接
2.3 解题思路和过程想法
(1)解题思路
典型的同逻辑处理暴力枚举不确切层次的题目,用递归实现。
# 递归出口:已处理的路径长度等于 len(digits)
# 处理逻辑:for 语句实现横向遍历(所有数字字符),递归语句实现纵向遍历(找到 len(digits) 个值)
# 递归函数的参数:数字字符串 digits ,当前递归数字字符的位置,全局变量:已遍历的路径 path、最终结果 res
(2)过程想法
多体会回溯的过程。
2.4 代码
class Solution:
def backTracing(self,digits,index,pathS,res):
# 递归出口:已经收集到 len(digit) 个字符
if len(digits) == index:
res.append(pathS)
return
# 数字字符对应的数字(int)
digit = int(digits[index])
# 获取数字字符对应的字符串
letters = self.numsMap[digit]
for i in range(len(letters)):
pathS += letters[i]
self.backTracing(digits,index+1,pathS,res) # 去下一个数字字符对应的字符串中获取
pathS = pathS[:-1] # 截掉最后一个字符
def letterCombinations(self, digits: str) -> List[str]:
# 用于存储每个数字对应的字母
self.numsMap = [
"", # 0
"", # 1
"abc", # 2
"def", # 3
"ghi", # 4
"jkl", # 5
"mno", # 6
"pqrs", # 7
"tuv", # 8
"wxyz" # 9
]
res = []
# 若数字串为空,则返回空
if not digits:
return []
# 用字符串""记录已遍历的结果,用 res 存储最终结果
self.backTracing(digits,0,"",res)
return res