1. 程式人生 > 其它 >VUE+Elementui實現複選框的多選與全選

VUE+Elementui實現複選框的多選與全選

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;
    
};