求解下一个排列

这是LeetCode上的一道题:

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:从右向左扫描,我们假设从右向左是一个递增的序列,当碰到a[i-1]<a[i]后,停止扫描,并在a[a.length-1]和a[i]之间,从右向左,找到第一个比a[i-1]大的数,两者交换位置,然后对a[i]到a[a.length-1]的序列进行翻转的操作。

代码如下(Java):

class Solution {
    public void nextPermutation(int[] nums) {
       
        int i=nums.length-1;
        while(i-1>=0 && nums[i-1]>=nums[i]){
            i--;
        }
        if(i==0){
            reverse(nums,0);
            return;
        }
        
        int index = i;
        int j=nums.length-1;
        while(j>=index && nums[j]<=nums[index-1]){
            j--;
        }
        swap(nums,index-1,j);
        reverse(nums,index);
        
        
    }
    public void reverse(int[] nums,int index){
        int i=index;
        int j=nums.length-1;
        while(i<j){
            swap(nums,i,j);
            i++;
            j--;
        }
    }
    public void swap(int[] nums,int i,int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

 

posted @ 2019-10-29 09:49  ShangyiChen  阅读(142)  评论(0编辑  收藏  举报