题目描述:
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
方法一:
从数组后面开始遍历,找到第一个不是降序的元素nums[i],再用一个循环,遍历 i 之后的元素,找到比 nums[i] 大的元素 nums[j] ,交换nums[i] 和 nums[j] ,然后再倒序交换 nums[i] 之后的元素即可
class Solution {
public void nextPermutation(int[] nums) {
int flag=0;
for (int i= nums.length-2;i>=0;i--){
if (flag==1)
break;
if (nums[i]<nums[i+1]){
for (int j= nums.length-1;j>i;j--){
if (nums[j]>nums[i]){
int temp = nums[i];
nums[i]=nums[j];
nums[j]=temp;
//倒序交换i+1到length-1的元素
for (int k=i+1,h= nums.length-1;k<h;k++,h--){
int t=nums[k];
nums[k]=nums[h];
nums[h]=t;
}
flag=1;
break;
}
}
}
}
if (flag==0){
//此时的数组是降序的,要把数组转换成升序
for (int i=0;i< nums.length/2;i++){
int temp=nums[i];
nums[i]=nums[nums.length-1-i];
nums[nums.length-1-i]=temp;
}
}
}
}
分析:
时间复杂度:O(n),因为只需要遍历两次
空间复杂度:O(1)