回溯算法
回溯算法C++实现详解
一、回溯算法概述
什么是回溯算法
回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃该解,即"回溯"并尝试其他可能的解。
核心思想
- 路径:已经做出的选择
- 选择列表:当前可以做的选择
- 结束条件:到达决策树底层,无法再做选择
算法模板
#include <vector>
#include <string>
#include <iostream>
using namespace std;
// 回溯算法模板
void backtrack(路径, 选择列表) {
if (满足结束条件) {
收集结果;
return;
}
for (选择 : 选择列表) {
做选择;
backtrack(路径, 选择列表);
撤销选择;
}
}
- 全排列问题
问题描述:给定一个不含重复数字的数组 nums,返回其所有可能的全排列。
思路:使用used数组标记已使用的元素,每次从未使用的元素中选择一个加入路径。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtrack(vector<int>& nums, vector<bool>& used) {
if (path.size() == nums.size()) {
result.push_back(path);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (used[i]) continue;
used[i] = true;
path.push_back(nums[i]);
backtrack(nums, used);
used[i] = false;
path.pop_back();
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(), false);
backtrack(nums, used);
return result;
}
};

浙公网安备 33010602011771号