LeetCode 11.10每日一题 31. 下一个排列【中等】

 

原题地址:https://leetcode-cn.com/problems/next-permutation/comments/

思路:

1、找到第一个左边比右边小的数 。如:1243,为2

2、该数右边找比它大的最小数,交换他们。3是最小的比2大的数,交换2和3,变为1342

3、该数右边升序排列。1324

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var nextPermutation = function(nums) {
    var n=nums.length-1;
    var i=n;
    while(i>=1){
        if(nums[i]>nums[i-1]){//找到右边的比左边的大的数 如:1243 此时i指向4,i-1指向2
            var j=i;
            var minj=nums[i];
            var res=i;
            while(j<=n){//找右边比2大的最小数,3
                if(nums[j]>nums[i-1]){
                    if(nums[j]<minj){
                        minj=nums[j];
                        res=j;
                    }
                }
                j++;
            }
            [nums[i-1], nums[res]] = [nums[res], nums[i-1]]; // 交换2和3 为1342
            var k = nums.length - 1;
            while(i<=n){//i后面的数排序 只能原地修改
                j=i+1;
                while(j<=n){
                    if(nums[i]>nums[j]){
                        [nums[i], nums[j]] = [nums[j], nums[i]]; 
                    }
                    j++;
                }
                i++
            }
            return nums;
        }
        else{
            if(i==1){//找不大更大的,则返回最小的
                return nums.sort((a,b)=>{return a-b});
            }
        }
        i--;
    }
};

posted @ 2020-11-12 19:27  梁涛999  阅读(89)  评论(0)    收藏  举报