思路:
本题要求找到比已知数组'稍大一点'的下一个排列
最大的难点是找规律,所以先自己构造一个较长数组的例子
比如: 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
};