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, do not allocate 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
重点是理解题意,什么是按照字典序排列的下一个序列呢?
从后往前找,直至遇到第一个nums[i-1]<nums[i],说明从nums[i]开始到最后它都是逆序的。即子序列{nums[i],....,nums[n-1]}已经达到了最大序列。那么,
下一个序列就要考虑nums[i-1],从后往前找到第一个大于nums[i-1]的数nums[k],将其交换到nums[i-1],此时子序列{nums[i],....,nums[n-1]}仍然是最大序列。
由nums[k]开始和后面的n-i-1个数组成序列,nums[k]放在子序列的开头,它的后面的数组成的子序列应该从最低的序列开始,这也是要找的next permutation. 因此,将子序列{nums[i],....,nums[n-1]}进行反转,首尾调换。这就是下一个序列。如果序列本身已是一个最大序列,就转到初始的最小序列。
class Solution {
//将序列从start到end进行反转
void reverse(vector
& nums, int start, int end)
{
int i,j;
for(i=start,j=end;i
& nums) {
int i,j,k,n=nums.size();
if(n<=1)
return;
for(i=n-1;i>0;i--)
{
if(nums[i]>nums[i-1])
break;
}
j=i-1;
if(i==0&&nums[0]>=nums[1])//如果发现没有两个相邻的数是nums[i-1]
0;k--)
{
if(nums[k]>nums[j])
{
swap(nums[j],nums[k]);
break;
}
}
reverse(nums,i,n-1);
}
};