理论基础
其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。
题目链接/文章讲解:代码随想录
回溯算法本质上是暴力搜索,类似于二叉树遍历的模版。暴力搜索在实际问题中容易超时,大部分问题需要考虑剪枝,一般是从遍历时每一层的个数i这里做文章。
77. 组合
对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。
在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。
本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。
题目链接/文章讲解:代码随想录
Python递归,剪枝:
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++版本:
cpp
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;
}
};