nextPermutation函数的java实现
步骤
- 找到最靠后的
i
得nums[i] < nums[i + 1]
- 此时区间
[i + 1, n - 1]
全部都是降序的, 在这个降序区间中找到比nums[i]
大的最小数nums[j]
- 交换
nums[i]
和nums[j]
- 翻转整个降序区间即
[i + 1, n - 1]
思路
来源: https://blog.csdn.net/qq_45735851/article/details/113362278
- 找到这样的i的时候, 降序区间
[i + 1, n - 1]
是已经排好的, 这时需要将nums[i]
变大一点, 也就是和后面比它大的最小数进行交换 - 交换之后, 再将最后的降序区间翻转
代码实现
class NextPermutation {
public static boolean nextPermutation(int[] nums) {
int n = nums.length;
int i = n - 2;
// 从后向前遍历数组, 找到第一个不是降序的数字
while (i >= 0 && nums[i] >= nums[i + 1]) {
--i;
}
// 如果i小于0,说明当前排列已经是字典序中的最大值(完全降序排列), 没有下一个排列
if (i < 0) {
return false;
}
int j = n - 1; // 从数组的最后一个元素开始
// 从后往前找到第一个大于nums[i]的元素,位置为j
while (nums[i] >= nums[j]) {
--j;
}
// 交换nums[i]和nums[j]
swap(nums, i, j);
// 将尾部的降序区间反转
reverse(nums, i + 1, n - 1);
return true;
}
private static void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
private static void reverse(int[] nums, int start, int end) {
while (start < end) {
swap(nums, start++, end--);
}
}
}