开始学回溯了!
class Solution(object):
def combine(self, n, k):
result = []
ans = []
startindex=1
self.backtracking(n,k,startindex,result,ans)
return result
def backtracking(self,n,k,startindex,result,ans):
if len(ans)==k:
result.append(ans[:])
return
for i in range(startindex,n-(k-len(ans))+2):
ans.append(i)
self.backtracking(n,k,i+1,result,ans)
ans.pop()
对于剪枝操作,我想说的是:
1.i表示对于当时ans状态,能求出符合题意结果的(第一次到最后一次)机会,startindex是第一次,n-(k-len(ans))+1是最后一次,左闭右开所以是再加1
2.(k-len(ans))是还可以添加几个元素,n-(k-len(ans))+1代表最后一次机会的那个元素,而且这道题i不是索引,而是数值,因为题目就是1到n的数值,也有误导性在。
class Solution(object):
def combinationSum3(self, k, n):
self.result =[]
self.nsum =0
ans =[]
self.backtrachking(k,n,1,ans)
return self.result
def backtrachking(self,k,n,index,ans):
if self.nsum > n:
return
if len(ans)==k:
if self.nsum == n:
self.result.append(ans[:])
return
for i in range(index,9-(k-len(ans))+2):
self.nsum+=i
ans.append(i)
self.backtrachking(k,n,i+1,ans)
ans.pop()
self.nsum-=i
1.是9-.............不是n-............
2.递归出口要判断lans的个数
class Solution(object):
def __init__(self):
self.letterMap = [
"", # 0
"", # 1
"abc", # 2
"def", # 3
"ghi", # 4
"jkl", # 5
"mno", # 6
"pqrs", # 7
"tuv", # 8
"wxyz" # 9
]
self.result=[]
self.s=""
def letterCombinations(self, digits):
if len(digits)==0:
return []
self.backtracking(digits,0)
return self.result
def backtracking(self ,digits ,index):
if index ==len(digits):
self.result.append(self.s)
return
digit = int(digits[index])
letters = self.letterMap[digit]
for i in range(len(letters)):
self.s+=letters[i]
self.backtracking(digits,index+1)
self.s=self.s[:-1]
最后一行注意是拷贝,而不是’操作‘,先切片再赋值。