给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations
初识回溯算法,代码如下:
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> select(nums.size(),false);
vector<int> path;
trackback(select,path,nums);
return result;
}
void trackback(vector<bool> select,vector<int> path,vector<int>& nums)
{
if(nums.size()==path.size())
{
result.emplace_back(path);
return;
}
for(int i=0;i<nums.size();i++)
{
if(select[i])
continue;
path.emplace_back(nums[i]);
select[i]=true;
trackback(select,path,nums);
select[i]=false;
path.pop_back();
}
}
};
该方法耗时稍长,若要深刻了解回溯算法和寻找更简单快速的方法,请到leetcode官网题库搜索“全排列”查看题解。
算法整体思路为创建一个路径数组path和一个选择数组select,其中选择数组作用是用来判断nums数组中的元素是否被选择了,之后根据回溯算法的步骤,先判断是否到达决策树的底端(跳出递归的条件),若没有则执行选择,将选择的元素放入路径数组path中,之后去掉该选择(select数组中对应下标的元素变为true,代表已选择过),再次执行回溯算法,直到到达决策树底端,即所有元素都被选择,且路径path长度与原来的nums数组长度相等,之后回到上一层继续执行,并将已经选择过的元素取消选择,路径也弹出该元素,之后执行下一次循环,即选择另一个元素,以此类推,直到走完整颗决策树。