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

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

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

输入:nums = [1,2,3]
输出:[1,3,2]
 
/**
 * 从后往前找到第一个升序对(i,j)
 * 从j到最后找到最小的k>i,交换k和i
 * 从j到最后降序排列 
 */
 public static void nextPermutation(int[] nums) {
        int j=-1;
        
        for(int i=nums.length-1;i>0;i--){
            if(nums[i]>nums[i-1]){
                j=i;
                
                break;
            }
        }
        
        if(j==-1){
            //已经是降序,整个倒置
            
            int l=0;
            int r=nums.length-1;
            if(nums.length%2!=0){
                while(l!=r){
                    int temp=nums[r];
                    nums[r]=nums[l];
                    nums[l]=temp;
                    l++;
                    r--;
                }
            }else{
                while(l!=nums.length/2){
                    int temp=nums[r];
                    nums[r]=nums[l];
                    nums[l]=temp;
                    l++;
                    r--;
                }

            }
        }else{
            //否则从j到最后找到最小的num[i]大的k,交换i和k,同时把j到最后降序排列
            int min=nums[j];
            int minI=j;
            for(int x=j;x<nums.length;x++){
                if(nums[x]>nums[j-1]&&nums[x]<min){
                    min=nums[x];
                    minI=x;
                    
                }
            }
            
            int temp=nums[j-1];
            nums[j-1]=nums[minI];
            nums[minI]=temp;
            
            Arrays.sort(nums, j, nums.length);
            
        }
        
    }