力扣31 下一个排列

7 阅读1分钟

思路:

本题要求找到比已知数组'稍大一点'的下一个排列
最大的难点是找规律,所以先自己构造一个较长数组的例子
比如: 1 3 5 7 9 8 6 4 2
交换7和8: 1 3 5 8 9 7 6 4 2
反转8右侧的部分: 9 7 6 4 2 --> 2 4 6 7 9
就得到下一个排列: 1 3 5 8 2 4 6 7 9

代码:

返回原地修改的数组
从后往前遍历,找到第一个递减元素m
再一次从后往前遍历,找到第一个比m大的元素n
交换m和n
反转m右侧所有的元素
增加边界条件的判定

var nextPermutation = function (nums) {
    let len = nums.length
    if (len === 1) {
        return
    }
    let m = -1
    let n = -1
    for (let i = len - 2; i >= 0; i--) {
        if (nums[i] < nums[i + 1]) {
            m = i
            break
        }
    }
    if (m >= 0) {
        for (let i = len - 1; i > m; i--) {
            if (nums[i] > nums[m]) {
                n = i
                break
            }
        }
        [nums[m], nums[n]] = [nums[n], nums[m]]
    }
    let j = m + 1
    let k = len - 1
    while (j < k) {
        [nums[j], nums[k]] = [nums[k], nums[j]]
        j++
        k--
    }
    return nums
};