s0077 optimization
This commit is contained in:
parent
b4bc826729
commit
72eb7d55ef
@ -1,8 +1,6 @@
|
|||||||
#ifndef S0077_COMBINATIONS_HPP
|
#ifndef S0077_COMBINATIONS_HPP
|
||||||
#define S0077_COMBINATIONS_HPP
|
#define S0077_COMBINATIONS_HPP
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -17,3 +17,54 @@
|
|||||||
为了防止重复,我们需要在 `[1, n]` 中的一个子区间 `[begin, n]` 中选择一个数,`[1, begin]` 是我们已经选过了的,因此我们需要 `int n` 和 `int begin` 来作为传入参数。
|
为了防止重复,我们需要在 `[1, n]` 中的一个子区间 `[begin, n]` 中选择一个数,`[1, begin]` 是我们已经选过了的,因此我们需要 `int n` 和 `int begin` 来作为传入参数。
|
||||||
|
|
||||||
在每次迭代中,我们从 `[begin, n]` 中挨个选一个数加到上一轮迭代传递进来的 `path` 中,然后进行下一轮迭代。
|
在每次迭代中,我们从 `[begin, n]` 中挨个选一个数加到上一轮迭代传递进来的 `path` 中,然后进行下一轮迭代。
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
void combineDFS(int n, int k, int begin, vector<int> &path,
|
||||||
|
vector<vector<int>> &result) {
|
||||||
|
// 当 path 长度等于 k 时停止迭代,并将加入结果
|
||||||
|
if (path.size() == k) {
|
||||||
|
result.push_back(path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 遍历可能的搜索起点
|
||||||
|
for (int i = begin; i <= n; ++i) {
|
||||||
|
// 将 i 加入路径
|
||||||
|
path.push_back(i);
|
||||||
|
// 下一轮搜索
|
||||||
|
combineDFS(n, k, i + 1, path, result);
|
||||||
|
// 回溯,撤销处理的节点
|
||||||
|
path.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
我们现在来看看能不能优化。
|
||||||
|
|
||||||
|
![optimization](https://paste.sainnhe.dev/NzcF.png)
|
||||||
|
|
||||||
|
在上图的这种情况中,每一层其实都可以剪掉一些不可能的分支,我们可以对每一层循环的终止条件进行限制,从而剪枝。
|
||||||
|
|
||||||
|
优化后的代码如下:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
void combineDFS(int n, int k, int begin, vector<int> &path,
|
||||||
|
vector<vector<int>> &result) {
|
||||||
|
// 当 path 长度等于 k 时停止迭代,并将加入结果
|
||||||
|
if (path.size() == k) {
|
||||||
|
result.push_back(path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 遍历可能的搜索起点
|
||||||
|
// 在这一步中,每一次循环都可以对末尾进行限制来剪枝
|
||||||
|
for (int i = begin; i <= n - (k - path.size()) + 1; ++i) {
|
||||||
|
// 将 i 加入路径
|
||||||
|
path.push_back(i);
|
||||||
|
// 下一轮搜索
|
||||||
|
combineDFS(n, k, i + 1, path, result);
|
||||||
|
// 回溯,撤销处理的节点
|
||||||
|
path.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -9,7 +9,8 @@ void combineDFS(int n, int k, int begin, vector<int> &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 遍历可能的搜索起点
|
// 遍历可能的搜索起点
|
||||||
for (int i = begin; i <= n; ++i) {
|
// 在这一步中,每一次循环都可以对末尾进行限制来剪枝
|
||||||
|
for (int i = begin; i <= n - (k - path.size()) + 1; ++i) {
|
||||||
// 将 i 加入路径
|
// 将 i 加入路径
|
||||||
path.push_back(i);
|
path.push_back(i);
|
||||||
// 下一轮搜索
|
// 下一轮搜索
|
||||||
|
Loading…
Reference in New Issue
Block a user