首页 > 其他 > 详细

字典顺序下一个

时间:2020-11-28 09:26:43      阅读:26      评论:0      收藏:0      [点我收藏+]

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

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

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

输入: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);
            
        }
        
    }

  

 

字典顺序下一个

原文:https://www.cnblogs.com/jieyi/p/14050818.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!