题目地址: 链接
找规律:从数组末尾开始向左查找第一个无法构成逆序的位置。将该元素与后续数组中大于它的最小值交换,此时后续数组仍保持逆序状态,最后将这部分数组翻转即可完成排序(代码为sort排序)。
js
/*
* @lc app=leetcode.cn id=31 lang=typescript
*
* [31] 下一个排列
*/
// @lc code=start
/**
Do not return anything, modify nums in-place instead.
*/
function nextPermutation(nums: number[]): void {
const n = nums.length;
for(let i = n - 1; i > 0; i --) {
if(nums[i] > nums[i - 1]) {
let [flag, flagIdx] = [Infinity, i];
for(let j = i; j < n; j ++) {
if(nums[j] > nums[i - 1] && nums[j] < flag) {
flagIdx = j;
flag = nums[j];
}
}
// subArr是一个有序数组,可以直接反转数组弄成有序数组
[nums[flagIdx], nums[i - 1]] = [nums[i - 1], nums[flagIdx]];
let subArr = nums.slice(i, n).sort((a, b) => a - b);
nums.splice(i, n - i, ...subArr);
return
}
}
for(let i = 0; i < (n >> 1); i ++) {
[nums[i], nums[n - i - 1]] = [nums[n - i - 1], nums[i]];
}
};
// @lc code=end