LeetCode刷题笔记-31. 下一个排列(数学)

题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

题解
因为必须原地修改且只允许使用额外常数空间,所以我们不能用暴力法排序之后选下一个数;参考大神题解的思路得到算法。
LeetCode刷题笔记-31. 下一个排列(数学)_第1张图片
代码如下:

class Solution {
    public void nextPermutation(int[] nums) {
        int temp=0;
        int i=nums.length-1,j=nums.length-1;
        while(i!=0&&nums[i-1]>=nums[i]) i--;//寻找小数
        if(i==0) {
            reverse(nums,0,nums.length-1);//这里也可使用Arrays.sort(nums),但比较耗时间,我们只需要逆序功能即可
            return;
        }
        while(i!=0&&j>i-1&&nums[i-1]>=nums[j]) j--;寻找大数
        temp=nums[j];
        nums[j]=nums[i-1];
        nums[i-1]=temp;//大数小数交换位置
        reverse(nums,i,nums.length-1);//也可用Arrays.sort(nums,i,nums.length)
            
    }
    public void reverse(int[] nums,int left,int right){
        int temp=0;
        while(right>left){
            temp=nums[right];
            nums[right]=nums[left];
            nums[left]=temp;
            right--;
            left++;
        }
    }
}

你可能感兴趣的:(LeetCode刷题笔记)