class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
result = []
self.backtracking(n,k,0,1,[],result)
return result
def backtracking(self,n,k,sum1,startIndex,path,result):
if len(path) == k:
if sum1 == n:
result.append(path[:])
return
for i in range(startIndex,10):
sum1 += i
path.append(i)
self.backtracking(n,k,sum1,i+1,path,result)
sum1 -= i
path.pop()
未经过剪枝处理,思路和77.组合一样,主要是将树结构画出来。
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
result = []
self.backtracking(n,k,0,1,[],result)
return result
def backtracking(self,n,k,sum1,startIndex,path,result):
if sum1 > n:
return
if len(path) == k:
if sum1 == n:
result.append(path[:])
return
for i in range(startIndex,9-(k-len(path))+2):
sum1 += i
path.append(i)
self.backtracking(n,k,sum1,i+1,path,result)
sum1 -= i
path.pop()
经过剪枝处理,主要考虑:1.当初始时,单个元素的值大于所要求的元素(k=4,9>4) ;2.集合个数,所剩余的元素不满足所要求的个数,直接进行后面的剪枝。
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.result = []
self.s = ""
def letterCombinations(self, digits: str) -> List[str]:
if len(digits) == 0:
return self.result
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]
1.映射操作,利用字典进行处理
2.self.s用来存储中间存放的元素,为全局变量需要事先声明
3.index用来表示遍历到哪个字符了,方便对于元素进行引用以及后续回溯操作
4.回溯中的for循环可以进行化简,由于第一次刷该题,采用更为直白的步骤,方便后续复习