题目:
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例:
输入:nums = [1,2,3] 输出:[1,3,2]
12345
12354
123465
123564
思路:
这道题的难点其实是要理解题目是什么意思
将该问题形式化地描述为:给定若干个数字,将其组合为一个整数。如何将这些数字重新排列,以得到下一个更大的整数。如 123 下一个更大的数为 132。如果没有更大的整数,则输出最小的整数。
如果已经是逆序了,那已经是最大了,就将他倒过来变成最小的。
比如对于12345
比这个数稍微大点的肯定就是12354,动前面的话变化很大
所以要从后往前找找第一个后面的数大于前面的数的,也要考虑这种情况
123465
我们先找到6比4大,但是这时交换6,4得到的123645肯定大于交换4,5得到的123564
现在我们可以有点感知了,找到这个数之后,再在之后找一个最小的与之交换,
把最大的数放到最后面。
思路清晰了
复杂度:
时间复杂度:O(n)
空间复杂度:O(1)
代码:
public void nextPermutation(int[] nums) {
int len = nums.length;
for(int i = len-1;i>0;--i){
//对这后面的数进行大小排序,然后交换比当前位稍微大一点的数和
if(nums[i] > nums[i-1]){
Arrays.sort(nums,i,len);
for(int j = i;j<len;++j){
if(nums[j]>nums[i-1]){
int temp = nums[i-1];
nums[i-1] = nums[j];
nums[j] = temp;
return;
}
}
}
}
//如果全是逆序,直接排
Arrays.sort(nums);
return;
}