描述
给定一个数字列表,返回其所有可能的排列。
你可以假设没有重复数字。
您在真实的面试中是否遇到过这个题?
是
样例
给出一个列表[1,2,3]
,其全排列为:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:
利用DFS的思想,先完全遍历,然后回溯
代码:
class Solution {
public:
/*
* @param nums: A list of integers.
* @return: A list of permutations.
*/
vector<vector<int>> permute(vector<int> &nums) {
// write your code here
vector<vector<int> >result;
vector<int>temp;
vector<bool>visited(nums.size(),false);
permuteDFS(nums,0,visited,temp,result);
return result;
}
void permuteDFS(vector<int>&nums,int level,vector<bool>&visited,vector<int>&temp,vector<vector<int> >&result)
{
if(level==nums.size())
result.push_back(temp);
else
{
for(int i=0;i<nums.size();i++)
{
if(!visited[i])
{
visited[i]=true;
temp.push_back(nums[i]);
permuteDFS(nums,level+1,visited,temp,result);
temp.pop_back();//将最后一个元素取出,并将其设置为未访问过,进行回溯
visited[i]=false;
}
}
}
}
};
代码解析:
if(!visited[i])
{
visited[i]=true;
temp.push_back(nums[i]);
permuteDFS(nums,level+1,visited,temp,result);
temp.pop_back();//将最后一个元素取出,并将其设置为未访问过,进行回溯
visited[i]=false;
}
其中temp.pop_back()和visited[i]=false,就是为下次回溯做准备,比如我们得到了全排列1,2,3,他的接下来的全排列为1,3,2。
如果得到的1,3,2呢,就是先将1,2,3中的3取出,并将3设置为未访问,执行一次循环后将3加入,此时2被设置为未访问,执行循环将其加入。
代码流程图: