题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
public class Solution {
public void nextPermutation(int[] nums) {
if (nums == null || nums.length < 2) return;
//第一步先找到最后一个小于关系
int beg = nums.length - 2;
while (beg >= 0 && nums[beg] >= nums[beg + 1]) beg--;
//如果是递减数列
if (beg == -1) {
reverse(nums, 0, nums.length - 1);
return;
}
//找到之后第一个大于beg的数
int end = nums.length - 1;
while (nums[end] <= nums[beg]) end--;
//交换着两个元素
int tmp = nums[beg];
nums[beg] = nums[end];
nums[end] = tmp;
//排序后面的
reverse(nums,beg+1,nums.length-1);
}
private void reverse(int[] nums, int beg, int end) {
if (beg == end) return;
while (beg < end) {
int temp = nums[beg];
nums[beg] = nums[end];
nums[end] = temp;
beg++;
end--;
}
}
}
结果如下: