当前位置:   article > 正文

代码随想录算法训练营day25 | 216.组合总和III,17.电话号码的字母组合

代码随想录算法训练营day25 | 216.组合总和III,17.电话号码的字母组合

216.组合总和III(medium)

  • 自己思路:利用#77. 组合的题解找出length为k的所有可能,然后对这个二维数组进行便利,如果和为n,那么就加入到结果集(或者和不为n时,delete)

  • 题解:(带类似#77剪枝操作)

  1. class Solution:
  2. def __init__(self):
  3. self.path = []
  4. self.result = []
  5. self.ans = []
  6. def combinationSum3(self, k: int, n: int) -> List[List[int]]:
  7. temp = self.bcktracking(9, k, 1)
  8. for j in range(len(temp)):
  9. if sum(temp[j]) == n:
  10. self.ans.append(temp[j])
  11. return self.ans
  12. def bcktracking(self, nums, k, startindex):#step1
  13. #step2
  14. if len(self.path) == k:
  15. self.result.append(self.path[:])
  16. return
  17. #step3
  18. for i in range(startindex, (nums-(k-len(self.path))+1)+1):#剪枝
  19. self.path.append(i)
  20. self.bcktracking(nums, k, i+1)
  21. self.path.pop()
  22. return self.result
  • 稍微优化一点:(带类似#77剪枝)

    • 当然也可以不使用自带的sum(),参考代码随想录题解
  1. class Solution:
  2. def __init__(self):
  3. self.path = []
  4. self.result = []
  5. def combinationSum3(self, k: int, n: int) -> List[List[int]]:
  6. return self.bcktracking(9, k, n, 1)
  7. def bcktracking(self, nums, k, n, startindex):#step1
  8. #step2
  9. if len(self.path) == k:
  10. if sum(self.path) == n:
  11. self.result.append(self.path[:])
  12. return
  13. #step3
  14. for i in range(startindex, (nums-(k-len(self.path))+1)+1):#类似#77剪枝
  15. self.path.append(i)
  16. self.bcktracking(nums, k, n, i+1)
  17. self.path.pop()
  18. return self.result
  • 本题还可剪枝:

    • 已选元素总和如果已经大于n了,那么往后遍历就没有意义了,直接剪掉
  1. class Solution:
  2. def __init__(self):
  3. self.path = []
  4. self.result = []
  5. def combinationSum3(self, k: int, n: int) -> List[List[int]]:
  6. return self.bcktracking(9, k, n, 1)
  7. def bcktracking(self, nums, k, n, startindex):#step1
  8. #step2
  9. if sum(self.path) > n:#剪枝
  10. return
  11. if len(self.path) == k:
  12. if sum(self.path) == n:
  13. self.result.append(self.path[:])
  14. return
  15. #step3
  16. for i in range(startindex, (nums-(k-len(self.path))+1)+1):#类似#77剪枝
  17. self.path.append(i)
  18. self.bcktracking(nums, k, n, i+1)
  19. self.path.pop()
  20. return self.result

17.电话号码的字母组合(medium)

  • 属于#77和#216的变形:因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而#77和#216都是是求同一个集合中的组合!

  1. class Solution:
  2. def __init__(self):
  3. self.s = ''
  4. self.res = []
  5. self.map = {0:'', 1:'', 2:'abc', 3:'def', 4:'ghi', 5:'jkl', 6:'mno', 7:'pqrs', 8:'tuv', 9:'wxyz'}
  6. def letterCombinations(self, digits: str) -> List[str]:
  7. return self.backtracking(digits, 0)
  8. def backtracking(self, digits, index):#step1
  9. #step2
  10. if index == len(digits):
  11. self.res.append(self.s)
  12. return
  13. #step3
  14. chars = self.map[int(digits[index])]
  15. for char in chars:
  16. self.s += char
  17. self.backtracking(digits, index+1)
  18. self.s = self.s[:len(self.s)-1] #回溯,相当于数组pop()操作
  19. return self.res

总结:

  • 回溯函数三部曲。

    • 参数的确定需要对回溯函数有整体的考量,本题的index就是为了提取对应的stirng

    • 终止条件最好借助树形图(还没实际画图来分析,需要加强)

    • 递归(回溯)逻辑暂时还停留在对组合问题的理解。后序题目做完再整理

  • Carl的题解是回溯函数没有返回值,但是实际上貌似也可以有,目前没有遇到问题,只要统一写法就行。

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

闽ICP备14008679号