Next Permutation

问题描述

  找出数组的下一个排列数组,如:
                        1,2,3 -> 1,3,2
                        1,1,5 -> 1,5,1
  分析后发现,这里的全排列可以组成这样的一个循环,比如:
    1,2,3 -> 1,3,2 -> 2,1,3 -> 2,3,1 -> 3,1,2 -> 3,2,1 -> 1,2,3

唯一要求

  必须原地修改,只允许使用额外常数空间。

解题思路

    从后往前遍历,找到降序的位置,如果整个序列没有降序的位置,例如 3,2,1,则直接返回升序序列。如果有降序情况,记录下标为 j,然后再次从后往前找到第一个大于 nums[j] 的值,交换这两个元素的值 ,将下标 j + 1 及往后的序列升序 即得到下一个排列。

 1 public class Solution {
 2     public void nextPermutation(int[] nums) {
 3         int n = nums.length;
 4         int j = -1;
 5         for (int i = n - 2; i >= 0; i --) {
 6             if (nums[i] < nums[i + 1]) {
 7                 j = i;
 8                 break;
 9             }
10         }
11         if (j == -1) {
12             Arrays.sort(nums);
13             return;
14         }
15         for (int k = n - 1; k > j; k --) {
16             if (nums[k] > nums[j]) {
17                 int tmp = nums[k];
18                 nums[k] = nums[j];
19                 nums[j] = tmp;
20                 break;
21             }
22         }
23         // reverse j+1 - end
24         reverse(nums, j + 1, n - 1);
25     }
26 
27     private void reverse(int[] nums, int l, int r) {
28         while (l < r) {
29             int tmp = nums[r];
30             nums[r] = nums[l];
31             nums[l] = tmp;
32             l ++;
33             r --;
34         }
35     }
36 }
原文地址:https://www.cnblogs.com/dogeLife/p/10998945.html