问题描述:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
例:1,2,3 → 1,3,2;3,2,1 → 1,2,3
思路:字典序算法这道题需要用到字典序的概念,基于此概念,直接进行求解。
时间复杂度:o(n)
空间复杂度:o(1)
class Solution {
public void nextPermutation(int[] nums) {
int len = nums.length;
if(len > 1){
int i, j;
out:
for(i = len - 1; i > 0; --i){
if(nums[i] > nums[i-1]){//遇到升序序列(从右至左)前的首降元素
for(j = len - 1; j >= i; --j){
if(nums[j] > nums[i-1]){//找到升序序列(从右至左)的第一个比首降元素大的元素,交换
int temp = nums[i - 1];
nums[i-1] = nums[j];
nums[j] = temp;
break out;
}
}
}
}
if(i == 0)//最大序列,转换成最小序列
Arrays.sort(nums);
else{//非最大序列,将前一步骤中首降元素后的子序列逆置,得到下一个字典排序
int k = len - 1;
while(i < k){
int temp = nums[i];
nums[i] = nums[k];
nums[k] = temp;
++i;--k;
}
}
}
}
}