/**
* 实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
* <p>
* 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
* <p>
* 必须 原地 修改,只允许使用额外常数空间
*
*/
public void nextPermutation(int[] nums) {
//数据校验
if (nums == null || nums.length == 0) {
throw new RuntimeException("数据输入有误~~");
} else if (nums.length == 1) {
nums = nums;
}
//考虑数组元素个数大于等于 2 的情况
//如果该数组元素是升序的,则只需要交换最后两位即可实现获取下一个更大的排序
//如果该数组元素不是升序的,若有升序有降序,则需要找到升序的两个元素,
// 再找到从右向前查找的比升序最小元素大的第一个数,交换位置,
// 将交换后后边的元素升序排列,实现后边元素最小,即下一个最小排序
//如果该数组元素是降序的,则说明该数组元素组成的序列已经最大,则下一个序列应该是升序排列的最小的数组
//定义min max为数组从右往左的第一次升序的两个数
int min = 0, max = 0, len = nums.length;
//定义flag,判断数组元素是否是降序的,若为降序的,则是最大排序,需要从小到大排序
boolean flag = true;
for (int i = len - 1; i > 0; i--) {
if (nums[i] > nums[i - 1]) {
max = i;
min = i - 1;
flag = false;
break;
}
}
//降序处理
if (flag) {
Arrays.sort(nums);
return;
}
//定义subMax保存从右到左的第一个大于min的值
int subMax = 0;
for (int i = len - 1; i > 0; i--) {
if (nums[i] > nums[min]) {
subMax = i;
break;
}
}
//交换min和subMax的值
int temp = nums[min];
nums[min] = nums[subMax];
nums[subMax] = temp;
//将min右边的元素排序
Arrays.sort(nums, min + 1, len);
}
原文:https://www.cnblogs.com/mx-info/p/14792781.html