31.下一个排列

2024/3/18

# Heading

    31.下一个排列 (opens new window)

    Tags: algorithms google array

    Langs: c cpp csharp dart golang java javascript kotlin php python python3 racket ruby rust scala swift typescript

    • algorithms
    • Medium (38.97%)
    • Likes: 2448
    • Dislikes: -
    • Total Accepted: 496.6K
    • Total Submissions: 1.3M
    • Testcase Example: '[1,2,3]'

    整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。

    • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1]

    整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

    • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2]
    • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]
    • arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

    给你一个整数数组 nums ,找出 nums 的下一个排列。

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

     

    示例 1:

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

    示例 2:

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

    示例 3:

    输入:nums = [1,1,5]
    输出:[1,5,1]
    

     

    提示:

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 100
    /*
     * @lc app=leetcode.cn id=31 lang=javascript
     *
     * [31] 下一个排列
     */
    
    // @lc code=start
    /**
     * @param {number[]} nums
     * @return {void} Do not return anything, modify nums in-place instead.
     */
    var nextPermutation = function (nums) {
      const swap = (a, b) => {
        const tmp = nums[a]
        nums[a] = nums[b]
        nums[b] = tmp
      }
    
      const revert = (a, b) => {
        while (a < b) {
          swap(a++, b--)
        }
      }
    
      for (let i = nums.length - 1; i > 0; i--) {
        if (nums[i] > nums[i - 1]) {
          for (let j = nums.length - 1; j >= i; j--) {
            if (nums[j] > nums[i - 1]) {
              swap(j, i - 1)
              revert(i, nums.length - 1)
              return
            }
          }
          break
        }
      }
      revert(0, nums.length - 1)
    }
    // @lc code=end
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38