题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
题解
因为必须原地修改且只允许使用额外常数空间,所以我们不能用暴力法排序之后选下一个数;参考大神题解的思路得到算法。
代码如下:
class Solution {
public void nextPermutation(int[] nums) {
int temp=0;
int i=nums.length-1,j=nums.length-1;
while(i!=0&&nums[i-1]>=nums[i]) i--;//寻找小数
if(i==0) {
reverse(nums,0,nums.length-1);//这里也可使用Arrays.sort(nums),但比较耗时间,我们只需要逆序功能即可
return;
}
while(i!=0&&j>i-1&&nums[i-1]>=nums[j]) j--;寻找大数
temp=nums[j];
nums[j]=nums[i-1];
nums[i-1]=temp;//大数小数交换位置
reverse(nums,i,nums.length-1);//也可用Arrays.sort(nums,i,nums.length)
}
public void reverse(int[] nums,int left,int right){
int temp=0;
while(right>left){
temp=nums[right];
nums[right]=nums[left];
nums[left]=temp;
right--;
left++;
}
}
}