实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
输入:nums = [1,2,3] 输出:[1,3,2]
/**
* 从后往前找到第一个升序对(i,j)
* 从j到最后找到最小的k>i,交换k和i
* 从j到最后降序排列
*/
public static void nextPermutation(int[] nums) { int j=-1; for(int i=nums.length-1;i>0;i--){ if(nums[i]>nums[i-1]){ j=i; break; } } if(j==-1){ //已经是降序,整个倒置 int l=0; int r=nums.length-1; if(nums.length%2!=0){ while(l!=r){ int temp=nums[r]; nums[r]=nums[l]; nums[l]=temp; l++; r--; } }else{ while(l!=nums.length/2){ int temp=nums[r]; nums[r]=nums[l]; nums[l]=temp; l++; r--; } } }else{ //否则从j到最后找到最小的num[i]大的k,交换i和k,同时把j到最后降序排列 int min=nums[j]; int minI=j; for(int x=j;x<nums.length;x++){ if(nums[x]>nums[j-1]&&nums[x]<min){ min=nums[x]; minI=x; } } int temp=nums[j-1]; nums[j-1]=nums[minI]; nums[minI]=temp; Arrays.sort(nums, j, nums.length); } }