Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding
outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路:题意是找到比原数大的最小的下一个数,从后往前找,发现第一个升序序列,记下位置pos,然后从后往前找找到第一个比pos位置上数大的那个数,与pos位置上数交换,然后翻转pos后的数字(因为这些是降序排列的,翻转后升序就是最小的数);特殊的,没有找到升序序列,直接翻转整个数组。
public class Solution {
public void nextPermutation(int[] nums) {
int pos = -1;
for (int i = nums.length - 1; i > 0; i--) {
if (nums[i - 1] < nums[i]) {
pos = i - 1;
break;
}
}
if (pos >= 0) {
for (int i = nums.length - 1; i > 0; i--) {
if (nums[i] > nums[pos]) {
int tmp = nums[pos];
nums[pos] = nums[i];
nums[i] = tmp;
break;
}
}
reverse(nums, pos + 1, nums.length - 1);
} else {
reverse(nums, 0, nums.length - 1);
}
}
public void reverse(int[] nums, int start, int end) {
while (start <= end) {
int tmp = nums[end];
nums[end] = nums[start];
nums[start] = tmp;
start++;
end--;
}
}
}

本文介绍了一个用于重新排列数字数组以获得下一个更大排列的算法。详细解释了如何在原地完成此操作,包括特殊情况处理和具体步骤。
602

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



