2019.2.18
题目描述:
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
这题是给定一个数字序列,要求返回所有的全排列。
解法一:
求全排列的算法显然用递归DFS即可,我们用一个out数组记录当前排列,用res返回所有的排列。当递归层数已经等于数组的长度,表明已经是一个完整的排列了,那么我们就可以将当前排列加入到res中,这里我们要注意,因为是排列,所以是不能有重复数字的,而DFS的时候,可能会有数字重复读取的情况,所以我们要借助一个visited数组来记录当前数字是否有被访问过。并且每次跳出递归的时候,要将visited数组重置为未访问,以便下一个排列再次使用。
C++代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> out;
vector<int> visited(nums.size(),0);
permuteDFS(nums,0,visited,out,res);
return res;
}
void permuteDFS(vector<int>& nums,int depth,vector<int> visited,vector<int> &out,vector<vector<int>> &res){
if(depth==nums.size()){
res.push_back(out);
return ;
}
for(int i=0;i<nums.size();++i){
if(visited[i]==1) continue;
visited[i]=1;
out.push_back(nums[i]);
permuteDFS(nums,depth+1,visited,out,res);
out.pop_back();
visited[i]=0;
}
}
};
解法二:
既然可以用递归DFS,这题我们也可以改用迭代来做,思想上是一样的,都是在空位上插入数字。
C++代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& num) {
vector<vector<int>> res{{}};
for (int a : num) {
for (int k = res.size(); k > 0; --k) {
vector<int> t = res.front();
res.erase(res.begin());
for (int i = 0; i <= t.size(); ++i) {
vector<int> one = t;
one.insert(one.begin() + i, a);
res.push_back(one);
}
}
}
return res;
}
};