实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
刚一开始看以为只要下一个输入比上一个输入大就行,其实是要输出比上一个大的最小的数。
对于一个整数左边是高位,右边是低位,所以为了获取一个比前一个数大,但是又比较小的数,就应该调整左边的低位。
思路:
按常规思路,如何找到尽量小的数?
1.从右往左遍历,找到第一个位置i比右边小的数
2.再从右往左遍历,找到第一个右边的数大于位置i的数两者交换
3.将i+1的位置及以后的数两两交换,就得到了最小的数
class Solution {
public void nextPermutation(int[] nums) {
int len=nums.length;
int i=len-2;
//找到第一个nums[i+1]>nums[i]的数
while(i>=0&&nums[i+1]<=nums[i]){
i--;
}
int j=len-1;
if(i>=0){
while(j>=0&&nums[i]>=nums[j]){
j--;
}
//将nums[i]与nums[j]进行交换
swap(nums,i,j);
}
reveser(nums,i+1);
}
public void swap(int[] nums,int i,int j){
int temp=nums[j];
nums[j]=nums[i];
nums[i]=temp;
}
public void reveser(int[] nums,int i){
int j=nums.length-1;
int n=i;
while(n<j){
swap(nums,n,j);
n++;
j--;
}
}
}