31. Next Permutation

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);
        
        
    }
};
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值