Leetcode刷题(第31题)——下一个排列

x33g5p2x  于2022-02-28 转载在 其他  
字(0.8k)|赞(0)|评价(0)|浏览(343)

一、题目

二、案例

  1. 案例一:
  2. 输入:nums = [1,2,3]
  3. 输出:[1,3,2]
  4. 案例二:
  5. 输入:nums = [3,2,1]
  6. 输出:[1,2,3]
  7. 案例三:
  8. 输入:nums = [1,1,5]
  9. 输出:[1,5,1]

三、思路
由上述题目可知,如果给定数组为降序可知,其不存在最大值,此时我们需要将其降序排列。
如果不为降序数组,我们按照如下方法。这里我们以[3,2,4,1,6,4,0]为例。
1、首先我们应该从后向前遍历,找到第一个降序的值,在该数组中第一个降序的值为 1。
2、然后从后往前找,比1小的值,并且交换位置,此时数组变为:[3,2,4,0,6,4,1]
3、然后再将从0下一位开始,由小到大的顺序排列,由于从6到1是按照从大到小的顺序排列,此时我们可以使用 [nums[x], nums[y]] = [nums[y], nums[x]]进行交换。
四、代码

  1. /**
  2. * @param {number[]} nums
  3. * @return {void} Do not return anything, modify nums in-place instead.
  4. */
  5. var nextPermutation = function (nums) {
  6. let length = nums.length
  7. let p = length - 1
  8. while (p > 0 && nums[p] <= nums[p - 1]) {
  9. p--
  10. }
  11. if (p > 0) {
  12. let p2 = length - 1
  13. let curValue = nums[p - 1]
  14. while (p > 0 && p2 > p) {
  15. if (curValue < nums[p2]) {
  16. break
  17. }
  18. p2--
  19. }
  20. [nums[p2], nums[p - 1]] = [nums[p - 1], nums[p2]]
  21. }
  22. let x = p
  23. let y = length - 1
  24. while(x < y) {
  25. [nums[x], nums[y]] = [nums[y], nums[x]]
  26. x++
  27. y--
  28. }
  29. };

五、总结

相关文章