给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路1:采用深度优先搜索的方法来做,设置一个bool型的索引数组,来表示这个数是否之前已经出现过。
class Solution {
public:
void dfs(vector<vector<int>> &re, vector<int>temp, vector<bool>index, vector<int>& nums){
if(temp.size()==nums.size()){
re.push_back(temp);
return;
}
for(int i=0; i<nums.size(); ++i){
if(index[i]) continue;
index[i]=true;
temp.push_back(nums[i]);
dfs(re, temp, index, nums);
index[i]=false;
temp.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>>re;
vector<int>temp;
vector<bool>index(nums.size(),false);
dfs(re, temp, index, nums);
return re;
}
};
思路2:用31. 下一个排列来做。
class Solution {
public:
vector<int> nextPermutation(vector<int>& nums) {
int i=nums.size()-1;
vector<int>re;
while(i>0 && nums[i]<=nums[i-1]) --i;
if(i==0) {
reverse(nums.begin(), nums.end());
return nums;
}
int flag=i;
for(int k=i; k<nums.size(); ++k){
if(nums[k]>nums[i-1] && nums[k]<=nums[flag])
flag=k;
}
swap(nums[i-1], nums[flag]);
reverse(nums.begin()+i, nums.end());
return nums;
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>>re;
int ct=1;
for(int i=2; i<=nums.size(); ++i){
ct*=i;
}
for(int i=0; i<ct; ++i){
re.push_back(nums);
nums=nextPermutation(nums);
}
return re;
}
};