- 题目:实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例:输入:nums = [1,2,3]
输出:[1,3,2]
public void nextPermutation(int[] nums){
// 要交换的较小和较大值的数组下标
int smallerIndex = 0;
int higherIndex = 0;
// 较小值后面的边缘数组下标
int edgeIndex = 0;
// 找较小值
for (int i = nums.length - 2; i >= 0; i--){
if (nums[i] < nums[i + 1]){
smallerIndex = i;
edgeIndex = i + 1;
break;
}
}
// 找较大值
for (int i = nums.length - 1; i >= edgeIndex; i--){
if (nums[i] > nums[smallerIndex]){
higherIndex = i;
break;
}
}
// 交换较小和较大值
swap(nums, smallerIndex, higherIndex);
// 反转边缘之后的子数组
reverse(nums, edgeIndex, nums.length - 1);
}
public void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
public void reverse(int[] nums, int left, int right){
while (left < right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}