216. 组合总和 III
题目链接:216. 组合总和 III
这题比之前的题目多了一个条件,可以模板写。剪枝操作要记牢。
combinations 库的使用
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
from itertools import combinations
res=[]
nums=[i for i in range(1,n+1)]
List=combinations(nums,k)
for i in List:
res.append(list(i))
return res
回溯写法
class Solution:
def __init__(self):
self.path=[]
self.Sum=0
self.res=[]
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
def backtracking(targetsum,k,start_index):
if self.Sum>targetsum:
return
if len(self.path)==k and self.Sum==targetsum:
self.res.append(self.path[:])
return
last_index=10-(k-len(self.path))+1
for i in range(start_index,last_index):
self.path.append(i)
self.Sum+=i
backtracking(targetsum,k,i+1)
self.path.pop()
self.Sum-=i
backtracking(n,k,1)
return self.res
17. 电话号码的字母组合
题目链接:17. 电话号码的字母组合
回溯算法
class Solution:
def __init__(self):
self.letter_map = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'
}
self.answer=[]
def letterCombinations(self, digits: str) -> List[str]:
if not digits :return []
answers=[]
def backtracking(digits,index,path):
if len(path)==len(digits):
answers.append(path)
return
letter: str=self.letter_map[digits[index]]
for i in range(len(letter)):
path=path+letter[i]
backtracking(digits,index+1,path)
path=path[:-1]
backtracking(digits,0,'')
return answers
知识点
- 字符串合并,str+str
- 删除最后一个字符,
lists=list(str),lists.pop()
或者path=path[:-1]