问题描述
* 找出数组的下一个排列数组,如:
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
唯一要求
* 必须原地修改,只允许使用额外常数空间。
解题思路
-
从后往前遍历,在内层循环中同样从后往前遍历,找到在当前节点右侧第一个比当前节点大的那个数的下标j,
交换这两个数,保持当前位置i后面的数升序即可。
1 class Solution {
2 public void nextPermutation(int[] nums) {
3 int numsLen = nums.length;
4 for (int i=numsLen-2; i>=0; i--) {
5 int j = numsLen-1;
6 while (j>i) {
7 // 找到在当前节点右侧第一个比当前节点大的那个数j。交换他们,
8 if(nums[j] > nums[i]) {
9 int temp = nums[i];
10 nums[i] = nums[j];
11 nums[j] = temp;
12 // 保持i后面的元素升序
13 sortHelper(nums, i+1, numsLen);
14 return;
15 }
16 j--;
17 }
18 }
19 Arrays.sort(nums);
20 return;
21 }
22 public void sortHelper(int[] nums, int start, int length) {
23 int[] num = new int[length-start];
24 System.out.println(num[0]);
25 System.arraycopy(nums, start, num, 0, length-start);
26 Arrays.sort(num);
27 System.arraycopy(num, 0, nums, start, length-start);
28 System.out.println(num[0]);
29 }
30 }