找出所有相加之和为 n
的 k
个数的组合,且满足下列条件:
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
参数:n,k 返回:列表
终止条件:设置一个原始列表,包含所有的数字,当这个列表的个数小于k,返回result
单层递归逻辑:
for循环
对于for循环中取值的优化还是有点懵。
代码:
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
if len(path) == k: # 当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)
# 回溯
currentSum -= i
path.pop()
给定一个仅包含数字 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
]
# 递归函数
def getCombinations(self, digits, index, path, result): # 接收四个参数
# digits:输入的字符串, index:当前处理的输入的数字的位置, path:当前已经生成的字母组合, result:最终的结果列表
# 终止条件
if index == len(digits): # 说明遍历结束
result.append(''.join(path))
return
# 输入的是字符串,转为整数类型
digit = int(digits[index])
letters = self.letterMap[digit] # 这里代表找索引
for letter in letters:
path.append(letter)
self.getCombinations(digits, index + 1, path, result)
# 回溯
path.pop()
# 主函数
def letterCombinations(self, digits: str) -> List[str]:
result = []
if len(digits) == 0:
return result
# 调用递归函数
self.getCombinations(digits, 0, [], result)
return result