leetcode31.下一个排列

leetcode31.下一个排列

题目

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

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

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

用例

输入:nums = [1,2,3]
输出:[1,3,2]
输入:nums = [3,2,1]
输出:[1,2,3]
输入:nums = [3,2,1]
输出:[1,2,3]
输入:nums = [1]
输出:[1]

求解

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var nextPermutation = function(nums) {
    let len = nums.length;
    let flag = false;
    if(len==1){
        return nums;
    } 
    for(let i=len -2;i>=0;i--){
        let min_index = null
        //找出比i大的且最小的
        for(let j=len-1;j>i;j--){
            if(nums[j]>nums[i]){
                if(min_index==null){
                    min_index=j
                }else{
                    if(nums[j]<nums[min_index]){
                        min_index=j
                    }
                }
            }
        }
        //说明已经存在
        if(min_index!=null){
            //对第i个和第min_index进行交换
            let temp = nums[i]
            nums[i]=nums[min_index]
            nums[min_index]=temp
            //对i+1到len-1进行反转
            let left = i+1
            let right = len-1
            while (left < right) {                            
                // i 右边的数进行翻转,使得变大的幅度小一些
                [nums[left], nums[right]] = [nums[right], nums[left]];
                left++;
                right--;
            }
            flag=true
            break;
        }
    }
    //如果flag==false,则返回最小的,使用排序
    if(flag == false){
        nums.sort(function(a, b){return a - b});
    }
    return nums;
    
};
posted @ 2021-11-01 14:09  BONiii  阅读(46)  评论(0)    收藏  举报