题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,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--;
}
}
}
结果如下:

本文深入讲解了实现获取下一个排列的函数的算法,该算法将给定数字序列重新排列成字典序中下一个更大的排列。若不存在更大排列,则重排为最小的升序排列。文章详细解释了如何原地修改数组,仅使用常数空间完成任务,并提供了具体实例和代码实现。
908

被折叠的 条评论
为什么被折叠?



