当前位置:   article > 正文

算法D24 | 回溯算法1| 理论基础 77. 组合

算法D24 | 回溯算法1| 理论基础 77. 组合

理论基础 

其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。

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

视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili

回溯算法本质上是暴力搜索,类似于二叉树遍历的模版。暴力搜索在实际问题中容易超时,大部分问题需要考虑剪枝,一般是从遍历时每一层的个数i这里做文章。

77. 组合  

对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。

在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。

本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。 

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

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

Python递归,剪枝:

  1. class Solution:
  2. def __init__(self):
  3. self.result = []
  4. self.path = []
  5. def backtracking(self, n, k, start_idx):
  6. if len(self.path) == k:
  7. self.result.append(self.path[:])
  8. return
  9. for i in range(start_idx, n-(k-len(self.path))+2):
  10. self.path.append(i)
  11. self.backtracking(n, k, i+1)
  12. self.path.pop()
  13. return
  14. def combine(self, n: int, k: int) -> List[List[int]]:
  15. self.backtracking(n, k, 1)
  16. return self.result

C++版本:

  1. class Solution {
  2. public:
  3. vector<vector<int>> result;
  4. vector<int> path;
  5. void backtracking(int n, int k, int startIndex) {
  6. if (path.size()==k) {
  7. result.push_back(path);
  8. return;
  9. }
  10. for (int i = startIndex; i < n-(k-path.size())+2; i++) {
  11. path.push_back(i);
  12. backtracking(n, k, i+1);
  13. path.pop_back();
  14. }
  15. return;
  16. }
  17. vector<vector<int>> combine(int n, int k) {
  18. backtracking(n, k, 1);
  19. return result;
  20. }
  21. };

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

闽ICP备14008679号