题目描述

https://leetcode.cn/problems/next-permutation/
image.png

解题思路

理解下一个排序的意思:
image.png
参照:https://leetcode.cn/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-leetcode-solution/
31. 下一个排列 - 图3
我们从后向前寻找第一个降序的数字,此时后边的都是降序,保证了排序尽可能的小,所以,在从后先前找到第一个比他大的数字,此时交换,即可获得一个排列,但是不是最小的,因为后边还有部分降序,此时把后边的降序变为升序即是最小的排序。

  1. class Solution {
  2. public void nextPermutation(int[] nums) {
  3. int i = nums.length - 2;
  4. // 从右向左找到第一个倒序的
  5. while (i >= 0 && nums[i] >= nums[i + 1]) {
  6. i--;
  7. }
  8. // 如果此时不是最大的排序
  9. if (i >= 0) {
  10. int j = nums.length - 1;
  11. while (j >= i && nums[j] <= nums[i]) {
  12. j--;
  13. }
  14. // 交换2个位置
  15. swap(nums, i, j);
  16. }
  17. // 反转数组,后面已经是从大到小的,小的往前放
  18. reverse(nums, i + 1);
  19. }
  20. public void swap(int[] nums, int i, int j) {
  21. int temp = nums[i];
  22. nums[i] = nums[j];
  23. nums[j] = temp;
  24. }
  25. // 反转数组
  26. public void reverse(int[] nums, int start) {
  27. int end = nums.length - 1;
  28. while (start < end) {
  29. swap(nums, start, end);
  30. start++;
  31. end--;
  32. }
  33. }
  34. }