下一个排列

package daily20201229;

/**
 * @author : zhaoliang
 * @program :newCoder
 * @description : 下一个排列
 * @create : 2020/12/29 21:02
 */
public class nextPermutation {
     
    //实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
    //如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
    //必须 原地 修改,只允许使用额外常数空间。
    public void nextPermutation(int[] nums){
     
        int len = nums.length;
        if (len <=1)return;
        int i = len-1;
        while (i >0 && nums[i] <=nums[i-1])
            i--;
        swapList(nums,i,len-1);
        if (i!=0){
     
            int j=i;
            while (nums[j] <=nums[i-1])j++;
            swapItem(nums,j,i-1);
        }
    }

    private void swapItem(int[] nums, int i, int j) {
     
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    private void swapList(int[] nums, int i, int j) {
     
        while (i < j){
     
            swapItem(nums,i,j);
            i++;
            j--;
        }
    }
}

你可能感兴趣的:(剑指Offer刷题(Java),常见算法题,LeetCode刷题,算法,数据结构,leetcode,动态规划)