思路: 看注释吧,谢谢,我注释写得很详细,这里就不再重新写了(懒...)
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型一维数组
*/
// 自定义一个比较器,实现数组的逆序排序
public class ComparaInverted implements Comparator<Integer> {
@Override
public int compare(Integer num1, Integer num2) {
return num2 - num1;
}
}
public int[] nextPermutation (int[] nums) {
Integer[] origin = new Integer[nums.length]; // 定义一个 Integer 数组,用于存放原始的数据
Integer[] originCopy = new Integer[nums.length]; // 原始数据的备份
for (int i = 0; i < nums.length; i++) { // 将原始的数据进行迁移
origin[i] = nums[i];
originCopy[i] = nums[i];
}
Arrays.sort(originCopy, new ComparaInverted()); // 将备份数据进行逆序排序
if (Arrays.equals(originCopy, origin)) { // 如果原始数据逆序排序后等于原始数据,那么说明,原始数据是在整个字典序的最后面,我们需要返回的是整个字典序的第一个数据
Arrays.sort(originCopy); // 将备份数据进行正序排序,即可得到字典序中的第一个数据
int[] res = new int[originCopy.length]; // 定义一个 int 类型的整数数组,存放题目要求的返回结果
for (int i = 0; i < originCopy.length; i++) {
res[i] = originCopy[i];
}
return res;
}
else { // 如果原始数据逆序排序后不等于原始数据,那么,在字典序中,肯定存在着比原始数据要大的数据,返回比原始数据大一位的数据
// 从原始数据的结尾开始遍历,找到位置 index,index 满足 origin[index] > origin[index - 1]
int index = 0;
for (int i = origin.length - 1; i > 0; i--) {
if (origin[i] > origin[i - 1]) {
index = i;
break;
}
}
// 此时,我们已经找到了 index 和 origin[index - 1],接下来,我们要做的是,在 index - 1 这个位置的右边部分,找到所有比 origin[index - 1] 大的数字中,最小的那一个数字
int minP = 0; // 定义一个指针,用于指向上述的数字所在的位置索引
int minVal = origin[index]; // 定义一个整型变量,用于存放最小的那个数字,初始化为 origin[index](注: origin[index]不一定是我们要找的那个最小的数字,我们希望的是,找到的那个数字的大小为 origin[index - 1] < num <= origin[index])
for (int i = origin.length - 1; i >= index; i--) {
if (origin[i] > origin[index - 1] && origin[i] <= minVal) {
minP = i;
minVal = origin[i];
}
}
// 最终,我们找到了这么一个数字的位置,然后,将这个位置上的数字与 origin[index - 1] 上的数字交换,同时,将以 index 往右的数字按照正序排列
int swap = origin[index - 1];
origin[index - 1] = origin[minP];
origin[minP] = swap;
Arrays.sort(origin, index, origin.length - 1);
int[] res = new int[origin.length]; // 定义一个 int 类型的整型数组,存放题目要求的返回结果
for (int i = 0; i < origin.length; i++) {
res[i] = origin[i];
}
return res;
}
}
}