https://leetcode-cn.com/problems/next-permutation/ 数组

基础

【31】下一个排列:中等 - 图1
这也是官方的方法,这样做性能不是很好,可以加强

  1. /**
  2. Do not return anything, modify nums in-place instead.
  3. */
  4. function nextPermutation(nums: number[]): void {
  5. let i = nums.length - 2;
  6. while (i >= 0 && nums[i + 1] <= nums[i]) {
  7. i--;
  8. }
  9. if (i >= 0) {
  10. let j = nums.length - 1;
  11. while(j >= 0 && nums[j] <= nums[i]) {
  12. j--;
  13. }
  14. [nums[i], nums[j]] = [nums[j], nums[i]]
  15. }
  16. reserve(nums, i + 1)
  17. };
  18. function reserve(nums: number[], start: number) {
  19. let i = start;
  20. let j = nums.length - 1;
  21. while(i < j) {
  22. [nums[i], nums[j]] = [nums[j], nums[i]]
  23. i++;
  24. j--;
  25. }
  26. }

进阶

解题思路,只要前面的有一个比后面的小了,那就可以从后面找一个最小的,放到当前位置,然后后面的内容做从小到大的排序

/**
 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))
};