leetcode46. 全排列 medium
题目描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路:
解法1:套用经典的回溯模板
解法2: 利用swap搞定每一位的所有可能性
解法3:耍赖,用STL的内置函数 next_permutation(),专门就是用来返回下一个全排列(要先sort)
解法1代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
if(nums.empty())
return {};
vector<vector<int>> res;
int depth=nums.size();
vector<int> out(depth,0);
vector<bool> visited(depth,false);
dfs(nums,out,visited,res,0,depth);
return res;
}
void dfs(vector<int>& nums,vector<int> &out, vector<bool> &visited,vector<vector<int>> &res,int level,int depth){
if(level==depth){
res.push_back(out);
return;
}
for(int i=0;i<depth;++i){
if(!visited[i]){
visited[i]=true;
out[level]=nums[i];
dfs(nums,out,visited,res,level+1,depth);
visited[i]=false;
}
}
}
};
解法2代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& num) {
vector<vector<int>> res;
permuteDFS(num, 0, res);
return res;
}
void permuteDFS(vector<int>& num, int start, vector<vector<int>>& res) {
if (start >= num.size()) res.push_back(num);
for (int i = start; i < num.size(); ++i) {
swap(num[start], num[i]);
permuteDFS(num, start + 1, res);
swap(num[start], num[i]);
}
}
};
解法3代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& num) {
vector<vector<int>> res;
sort(num.begin(), num.end());
res.push_back(num);
while (next_permutation(num.begin(), num.end())) {
res.push_back(num);
}
return res;
}
};