基础
这也是官方的方法,这样做性能不是很好,可以加强
/**
Do not return anything, modify nums in-place instead.
*/
function nextPermutation(nums: number[]): void {
let i = nums.length - 2;
while (i >= 0 && nums[i + 1] <= nums[i]) {
i--;
}
if (i >= 0) {
let j = nums.length - 1;
while(j >= 0 && nums[j] <= nums[i]) {
j--;
}
[nums[i], nums[j]] = [nums[j], nums[i]]
}
reserve(nums, i + 1)
};
function reserve(nums: number[], start: number) {
let i = start;
let j = nums.length - 1;
while(i < j) {
[nums[i], nums[j]] = [nums[j], nums[i]]
i++;
j--;
}
}
进阶
解题思路,只要前面的有一个比后面的小了,那就可以从后面找一个最小的,放到当前位置,然后后面的内容做从小到大的排序
/**
Do not return anything, modify nums in-place instead.
*/
function nextPermutation(nums: number[]): void {
let i = nums.length - 1;
for (; i > 0; i--) {
if (nums[i] > nums[i - 1]) {
break;
}
}
let minIndex = i;
for (let j = i; j < nums.length; j++) {
if (nums[j] > nums[i - 1] && nums[j] < nums[minIndex]) {
minIndex = j;
}
}
if (i > 0) {
[nums[minIndex], nums[i - 1]] = [nums[i - 1], nums[minIndex]]
}
nums.splice(i, nums.length, ...nums.slice(i).sort((a, b) => a - b))
};