js + leetcode刷題:No.31 下一個排列

思路:從右向左查找,查找第一個左值小於右邊的值;改位置處需要調整;然後處理;找不到,升序

題目:

  1. 下一個排列
    實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
    如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
    必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

解法:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
// 時間O(N*N) 空間 O(1)
var nextPermutation = function(nums) {
    for (let i = nums.length - 1; i > 0; i--) {
       // 找到符合下標i
       if (nums[i] > nums[i - 1]) {
           let min = nums[i];
           let k = i;
           // 查找第一個左值小於右邊的值
           for (let j = i; j < nums.length ; j++) {
               // 查找大於左值小於右值
               if (min > nums[j] && nums[i-1] < nums[j]) {
                   min = nums[j]
                   k = j
               }
           }
           // 對調
           [nums[i - 1], nums[k]] = [nums[k], nums[i - 1]];
           //拿到對調後的數組數據
           let newArr = nums.filter((item, key) => {
               return key >= i;
           })
           // 將後面的升序
           newArr.sort((a, b) => a - b)
           for (let m = 0; m < newArr.length; m++) {
               nums[i + m] = newArr[m]
           }
           return nums;
       }
   }
   // 沒找到,升序
   nums.sort((a, b) => a - b)
   return nums;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章