问题:
给定一组不同的整数,返回所有可能的排列。
示例:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
思路:
方法一:借鉴Next Permutations中的方法,但是在Next Permutations时要先排序,C++代码如下:
class Solution {
public:
void quicksort(vector<int>& nums,int begin,int end)
{
if(begin >= end)
return;
int i = begin;
int j = end;
int key = nums[begin];
while(i != j)
{
while(nums[j] >= key && i<j)
{
j--;
}
while(nums[i] <= key && i<j)
{
i++;
}
if(i < j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
nums[begin] = nums[i];
nums[i] = key;
quicksort(nums,begin,i-1);
quicksort(nums,i+1,end);
}
vector<vector<int> > permute(vector<int>& nums) {
vector<vector<int> > res;
quicksort(nums,0,nums.size()-1);
res.push_back(nums);
if(nums.size() <= 1)
{
return res;
}
int i;
while(true)
{
i = nums.size()-2;
while(nums[i] > nums[i+1])
{
i--;
}
if(i < 0)
break;
int min = 9999;
int k;
for(int j = i+1;j<nums.size();j++)
{
if(min > nums[j] && nums[j] > nums[i])
{
min = nums[j];
k = j;
}
}
swap(nums[i],nums[k]);
quicksort(nums,i+1,nums.size()-1);
res.push_back(nums);
}
return res;
}
};
方法二:
递归实现
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int> > ret;
Helper(ret, num, 0);
return ret;
}
void Helper(vector<vector<int> >& ret, vector<int> num, int pos)
{
if(pos == num.size()-1)
ret.push_back(num);
else
{
for(int i = pos; i < num.size(); i ++)
{//swap all the ints to the current position
swap(num[pos], num[i]);
Helper(ret, num, pos+1);
swap(num[pos], num[i]);
}
}
}
};