这题直接举个例子更直观
{1, 5, 8, 4, 7, 6, 5, 3, 1} 这样一个序列,我们想找比他大的下一个排序,那么首先要从后往前找第一个非升序的数字,也就是a[i] < a[i+1]的第一个(如果整个数组都是降序排列,说明它已经是最大的排列了,直接反转数组得到第一个排列),于是我们找到了4。这时候为了得到更大的序列,我们需要把4和它后面的一个比它大的数字交换,同时为了使交换之后的序列增大最小,我们需要找到从后往前第一个比4大的数字,于是我们又找到了5,将他们交换后得到 {1, 5, 8, 5, 7, 6, 4, 3, 1}, 最后将交换完成后的5之后的序列从小到大重排序,得到{1, 5, 8, 5, 1, 3, 4, 6, 7}就是原排列的下一个排列了。
代码如下
class Solution { public void nextPermutation(int[] nums) { if(nums == null && nums.length <= 1) return; int i = nums.length - 2; while(i>=0 && nums[i] >= nums[i+1]){ i--; } if(i < 0){ reverseArray(nums, 0); return; } for(int j = nums.length - 1; j>i; j--){ if(nums[i] < nums[j]){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; break; } } reverseArray(nums, i+1); } public static void reverseArray(int[] a, int start){ int l = start; int r = a.length - 1; while(l < r){ int tmp = a[l]; a[l] = a[r]; a[r] = tmp; l++; r--; } } }