当前位置:   article > 正文

代码随想录算法训练营day25|216.组合总和III

代码随想录算法训练营day25|216.组合总和III

跟77题差不多,要搞清楚k确定了递归的深度 

依旧用回溯三部曲,就是终止条件多了

  1. class Solution:
  2. def combinationSum3(self, k: int, n: int) -> List[List[int]]:
  3. result = []
  4. self.backtracking(n,k,1,[],result)
  5. return result
  6. def backtracking(self,n,k,startIndex,path,result):
  7. if len(path) == k and sum(path) == n:
  8. result.append(path[:])
  9. for i in range(startIndex,10):
  10. path.append(i)
  11. self.backtracking(n,k,i+1,path,result)
  12. path.pop()

剪枝优化

  1. class Solution:
  2. def combinationSum3(self, k: int, n: int) -> List[List[int]]:
  3. result = []
  4. self.backtracking(n,k,1,[],result)
  5. return result
  6. def backtracking(self,n,k,startIndex,path,result):
  7. if sum(path)>n: #优化,当sum(path)>n的时候,就不往下递归了
  8. return
  9. if len(path) == k and sum(path) == n:
  10. result.append(path[:])
  11. for i in range(startIndex,9-(k-len(path))+2): #优化
  12. path.append(i)
  13. self.backtracking(n,k,i+1,path,result)
  14. path.pop()

 17.电话号码的字母组合

题目链接/文章讲解:代码随想录

这道题与上一题的区别在于,本题是在两个集合里面取数,把两个集合里面的元素进行组合。

例如:输入:"23",抽象为树形结构,如图所示:

17. 电话号码的字母组合

 首先用二维数组进行映射,result用来储存最终结果,s用来储存每次路径走完时收集到的结果

  1. def __init__(self):
  2. self.letterMap = [
  3. "", # 0
  4. "", # 1
  5. "abc", # 2
  6. "def", # 3
  7. "ghi", # 4
  8. "jkl", # 5
  9. "mno", # 6
  10. "pqrs", # 7
  11. "tuv", # 8
  12. "wxyz" # 9
  13. ]
  14. self.result = []
  15. self.s = ""

确定终止条件:递归的深度就是digits的长度

代码如下:

  1. class Solution:
  2. def __init(self):
  3. self.letterMap=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
  4. self.result = []
  5. self.s = ''
  6. def letterCombinations(self, digits: str) -> List[str]:
  7. self.back(digits,0)
  8. return self.result
  9. def back(self,digits,index):
  10. #终止条件
  11. if index == len(digits): #或者 if len(self.s) == len(digits):
  12. self.result.append(self.s)
  13. return
  14. #递归逻辑
  15. digit = int(digits[index]) #将index指向的数字转为int
  16. letters = self.letterMap[digit] #取数字对应的字符集
  17. for i in range(len(letters)):
  18. self.s += letters[i]
  19. self.back(digits,index+1) #下一层递归,需要取digits下一个数字所对应的字符集
  20. self.s -= letters[i] #回溯

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/526876
推荐阅读
相关标签
  

闽ICP备14008679号