46. 全排列(C++题解含VS可运行源程序)
1.题解
回溯法
-
使用回溯算法,深度优先遍历+状态重置
-
全排列的话,当前结点值的候选区间是:从根到当前结点这条路径中未使用过的,因此需要使用used数组将这条路径使用过的值作个标记。
-
自然当前结点值的选择就是从0开始,所有未被标记过的都可以,如果作出了一个选择,就把这个增添到路径used中,下一层递归中就不会被重复选到了。
-
并且对于同一层的后面结点,需要恢复现场,把选过的那个恢复为false,这样就不会影响后面结点的孩子了。
排列问题:
- 排列问题:for循环从0开始,需要continue的是从根到当前结点这条路径中使用过的值(用used标记)
- 排列问题的终止条件是path到达叶子结点
2.力扣C++源码
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return res;
}
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int>& nums, vector<bool>& used) {
if (nums.size() == path.size()) {
res.push_back(path);