31. Next Permutation
Medium
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place and use only constant extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
Accepted
284,516
Submissions
910,416
可能这道题的本意不是考察这个函数?但是这个函数用上真的好快啊(捂脸),后面再看其他方法;
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n=nums.size();
int a[n]={};
for(int i=0;i<n;i++){
a[i]=nums[i];
}
if(next_permutation(a,a+n)==false){//直接使用函数next_permutation
sort(nums.begin(),nums.end());return;
}else{
for(int i=0;i<n;i++){
nums[i]=a[i];
}
return;
}
}
};
下面这个参考其他同学的代码,
class Solution {
public:
void nextPermutation(vector<int>& nums) {
bool find = false;
for (int i = nums.size()-2; i >= 0; i--)//从倒数第二个数字开始
{
int tmp = INT_MAX,pos;
for (int j = i+1; j < nums.size(); j++)//倒数第二个数字的右边找到比他大的最小数
{
if (nums[j] > nums[i] && nums[j] < tmp)
{
tmp = nums[j];
pos = j;
find = true;
}
}
if (find)
{
nums[i] = nums[i]^nums[pos];//异或交换位置
nums[pos] = nums[pos]^nums[i];
nums[i] = nums[i]^nums[pos];
sort(nums.begin()+i+1,nums.end());
return;
}
}
int size = nums.size();
for (int i = 0; i < size/2; i++)
{
nums[i] = nums[i]^nums[size-i-1];
nums[size-i-1] = nums[i]^nums[size-i-1];
nums[i] = nums[i]^nums[size-i-1];;
}
}
};