实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
输入: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);
}
}