216.组合总和III
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
# 在nums中取数
nums = [i for i in range(1, 10)]
res = []
def Backtracking(cur_nums, cur_res, sumn, index):
"""
cur_nums:当前可选的数字集合
cur_res:当前的组合结果
sumn:当前组合结果中的数字和
index:当前可选数字的起始索引
"""
# 终止条件
if sumn == 0 and len(cur_res) == k:
res.append(cur_res[:])
return
elif sumn != 0 and len(cur_res) == k:
return
# 遍历当前可选的数字集合
for i in range(index, len(cur_nums)): # 使用 cur_nums 而不是 nums
# 将当前数字加入组合结果
cur_res.append(cur_nums[i]) # 使用 cur_nums 而不是 nums
Backtracking(cur_nums, cur_res, sumn - cur_nums[i], i + 1) # 传递 sumn - cur_nums[i]
# 回溯 撤销最后一个数字
cur_res.pop()
Backtracking(nums, [], n, 0) # 使用 nums 而不是 cur_nums
return res
17.电话号码的字母组合
回溯
这部分代码不太好想
对 对应数字中的字母集合遍历
for letter in phone[nextdigit[0]]:
BackTracking(conbination+letter,nextdigit[1:])
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits:return []
phone = {'2':['a','b','c'],
'3':['d','e','f'],
'4':['g','h','i'],
'5':['j','k','l'],
'6':['m','n','o'],
'7':['p','q','r','s'],
'8':['t','u','v'],
'9':['w','x','y','z']}
res = []
def BackTracking(conbination,nextdigit):
# 终止条件
if len(nextdigit)==0:
res.append(conbination)
return
# 对 对应数字中的字母集合遍历
for letter in phone[nextdigit[0]]:
BackTracking(conbination+letter,nextdigit[1:])
BackTracking('',digits)
return res
队列
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits:return []
phone = ['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
queue = [''] #初始化队列
for digit in digits:
for _ in range(len(queue)):
tmp = queue.pop(0)
for letter in phone[int(digit)-2]:
queue.append(tmp+letter)
return queue