代码随想录算法训练营|216.组合总和III;17.电话号码的字母组合;
216.组合总和III
题目链接: 216.组合总和III
文档讲解: 代码随想录
题目难度:中等
思路:递归法
时间复杂度:O(n*2^n);空间复杂度:O(n)
下面展示 代码
:
class Solution:
def backtracking(self, n,k,start,sum, path,res):
if sum > n:
return
if len(path) == k and sum == n:
res.append(path[:]) # 终止条件
return
else:
for i in range(start, 9-(k-len(path)) + 2):
path.append(i)
sum += i
self.backtracking(n,k,i + 1,sum, path,res)
path.pop() # 回溯
sum -= i
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
# 和为n的k个数,(1-9)
if k == 1:
if 1 <= n <= 9:
return [n]
else:
return []
else:
res = []
self.backtracking(n, k, 1,0,[], res)
return res
17.电话号码的字母组合
题目链接: 17.电话号码的字母组合
文档讲解: 代码随想录
题目难度:中等
思路:递归+构造号码字典
时间复杂度:O(n*2^n);空间复杂度:O(n)
代码
如下
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.res = []
self.s = ""
def backtracking(self, digits, index):
if len(digits) == index:
self.res.append(self.s)
return
else:
num = int(digits[index])
string = self.letterMap[num]
for i in range(len(string)):
self.s += string[i]
self.backtracking(digits, index + 1)
self.s = self.s[:-1]
def letterCombinations(self, digits: str) -> List[str]:
if len(digits) == 0:
return self.res
else:
self.backtracking(digits, 0)
return self.res