赞
踩
其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。
题目链接/文章讲解:代码随想录
回溯算法本质上是暴力搜索,类似于二叉树遍历的模版。暴力搜索在实际问题中容易超时,大部分问题需要考虑剪枝,一般是从遍历时每一层的个数i这里做文章。
对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。
在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。
本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。
题目链接/文章讲解:代码随想录
Python递归,剪枝:
- class Solution:
- def __init__(self):
- self.result = []
- self.path = []
-
- def backtracking(self, n, k, start_idx):
- if len(self.path) == k:
- self.result.append(self.path[:])
- return
- for i in range(start_idx, n-(k-len(self.path))+2):
- self.path.append(i)
- self.backtracking(n, k, i+1)
- self.path.pop()
- return
-
- def combine(self, n: int, k: int) -> List[List[int]]:
- self.backtracking(n, k, 1)
- return self.result
C++版本:
- class Solution {
- public:
- vector<vector<int>> result;
- vector<int> path;
- void backtracking(int n, int k, int startIndex) {
- if (path.size()==k) {
- result.push_back(path);
- return;
- }
- for (int i = startIndex; i < n-(k-path.size())+2; i++) {
- path.push_back(i);
- backtracking(n, k, i+1);
- path.pop_back();
- }
- return;
- }
- vector<vector<int>> combine(int n, int k) {
- backtracking(n, k, 1);
- return result;
- }
- };
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。