216. 组合总和 III
和上一道组合题一样
回溯就是【处理自己】- 【递归】-【弹出自己】
这题可以剪枝很多:超了就剪枝;剩余不够也剪枝
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res=[]
self.back(n,k,0,1,[],res)
return res
def back(self,targetsum,k,cursum,start,path,res):
if cursum>targetsum:return
if len(path)==k:
if cursum==targetsum:
res.append(path[:])
return
for i in range(start,9-(k-len(path))+2):
cursum+=i
path.append(i)
self.back(targetsum,k,cursum,i+1,path,res)
cursum-=i
path.pop()
这个题是两个集合的combine 和上一题其实差不多 需要一个全局的数字字母对应表
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
self.letters=["","","abc",'def','ghi','jkl','mno','pqrs','tuv','wxyz']
self.res=[]
self.s=''
if len(digits)==0:return self.res
self.back(digits,0)
return self.res
def back(self,digits,idx):
if idx==len(digits):
self.res.append(self.s)
return
digit=int(digits[idx])
letter=self.letters[digit]
for i in range(len(letter)):
self.s+=letter[i]
self.back(digits,idx+1)
self.s=self.s[:-1]