跳转至

LC31 - 下一个排列

NextPermutation.go
package Other

import "slices"

func nextPermutation(nums []int) {
    size := len(nums)
    i, j := -1, -1
    // (1) 从右往左寻找递减序列的左边界位置i
    for k := size - 2; k >= 0; k-- {
        if nums[k] < nums[k+1] {
            i = k
            break
        }
    }
    if i != -1 {
        // (2) 在递减序列中寻找大于nums[i]的最小值位置j
        // 随后交换i位置和j位置的值
        for k := size - 1; k > i; k-- {
            if nums[k] > nums[i] {
                j = k
                break
            }
        }
        nums[i], nums[j] = nums[j], nums[i]
    }
    // (3) 反转递减序列,使其按升序排列
    slices.Reverse(nums[i+1:])
}

本题是一个好题,具体过程注释已经写得比较清楚。