实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]
示例 4:
输入:nums = [1]
输出:[1]
先从后面开始遍历查找,连续二个个的比较,如果前一个小于后一个,记下前一个的下标 index ,然后从后面再次遍历查找比记录的值大的第一个值,让他俩交换值,最后把index后面的所有进行升序排列就可以了,不过index后面的值都是降序,交换一下位置就是升序了。
代码如下:
class Solution {
public void nextPermutation(int[] nums) {
if(nums.length==1) return ;
int len=nums.length-1;
int k=0;
//判断一下前一个数字比后面小,我们需要从这里入手
while(len>0){
if(nums[len]>nums[len-1]) break;
len--;
}
if(len!=0){//等于0 说明是该数是最大
k=nums.length-1;
//从右边开始查找第一个比nums[len-1]大的数
while(k>=len&&nums[k]<=nums[len-1]){
k--;
}//交换两个的值
abc(nums,k,len-1);
}
//反转一下后面所有
k=len;
len=nums.length-1;
while(k<=len){
abc(nums,k,len);
k++;
len--;
}
}
public void abc(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}