31. 下一个排列

package leetcode;

public class demo_31 {
    public void nextPermutation(int[] nums) {
        int i;
        int j;
        for(i=nums.length-1;i>0;i--) {
            //从右往左寻找出nums[i-1]<nums[i]
            if(nums[i-1]<nums[i]) {
                int min=i;
                //从i开始寻找最小的一个但是大于nums[i-1]的位置
                for(j=nums.length-1;j>=i;j--) {
                    //从i开始的数组是非降序的,第一个大于nums[i-1]的就是最小的
                    if(nums[j]>nums[i-1]) {
                        min=j;
                        break;
                    }
                }
                //交换nums[i-1]和nums[min]的位置
                int k=nums[i-1];
                nums[i-1]=nums[min];
                nums[min]=k;        
                break;
            }
        }
        //因为从i开始都是非降序的,所以要调整为从i开始最小的数组
        j=nums.length-1;
        while(i<j) {
            int k=nums[i];
            nums[i]=nums[j];
            nums[j]=k;
            i++;
            j--;
        }
        for(int k:nums) {
            System.out.print(k+" ");
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        demo_31 d31=new demo_31();
        int[] nums= {2,3,1,3,3};
        d31.nextPermutation(nums);
    }

}

 

posted on 2021-05-16 16:44  一仟零一夜丶  阅读(50)  评论(0)    收藏  举报