216. 组合总和 III
和组合一样的思路,但这样写计算sum,复杂度较大
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
path = []
res = []
def recursion(n, j, k):
if len(path) == k and sum(path) == n:
res.append(path[:])
return
for i in range(j, 10):
path.append(i)
recursion(n, i+1, k)
path.pop()
recursion(n, 1, k)
return res
用summ变量
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
path = []
res = []
def recursion(n, j, k, summ):
if len(path) == k and summ == n:
res.append(path[:])
return
for i in range(j, 10):
path.append(i)
summ += i
recursion(n, i+1, k, summ)
p = path.pop()
summ -= p
recursion(n, 1, k, 0)
return res
17. 电话号码的字母组合
如果path用str的类型,不能成为中间变量赋值
关键是要用键盘的dict构建对应数组,在遍历过程中改变位置时,改变遍历的字符串digits[i]
def letterCombinations(self, digits: str) -> List[str]:
if digits == "":
return []
dic = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'}
path = []
res = []
def recursion(digits, i):
if len(path) == len(digits):
p = ''.join(path[:])
res.append(p)
return
# digits
letters = dic[digits[i]]
# print(letters)
for l in letters:
path.append(l)
recursion(digits, i+1)
path.pop()
recursion(digits, 0)
return res
或者定义类,用变量形式创建中间变量ans
class Solution:
def __init__(self):
self.res = []
self.ans = ''
self.dic = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'}
def letterCombinations(self, digits: str) -> List[str]:
if not digits:
return []
self.recursion(digits,0)
return self.res
def recursion(self,digits,i):
if len(self.ans) == len(digits):
self.res.append(self.ans)
return
letters: str = self.dic[digits[i]]
for letter in letters:
self.ans += letter # 处理
self.recursion(digits, i + 1) # 递归至下一层
self.ans = self.ans[:-1]