这个题目如果选择暴力破解的话,循环很多条件很杂
我暂时觉得比较好的方法应该是递归
class Solution {
// 主方法,处理下一个排列
public void nextPermutation(int[] nums) {
int length = nums.length; // 获取数组的长度
back(nums, length - 1, length); // 从数组末尾开始寻找下一个排列
}
// 递归方法 back,用于寻找下一个排列
public void back(int[] nums, int start, int length) {
// 如果已经遍历到了数组的起始位置,说明没有更大的排列,需将数组重新排序为最小排列
if (start < 0) {
Arrays.sort(nums); // 将数组排序成最小排列(升序)
return;
} else {
// 从数组末尾开始,寻找第一个比 nums[start] 大的元素
for (int i = length - 1; i >= start; i--) {
if (nums[start] < nums[i]) {
// 交换 nums[start] 和 nums[i]
swap(nums, start, i);
// 将 start 之后的元素重新排序成最小排列
check(nums, start, length);
return; // 退出函数,因为已经找到下一个排列
}
}
// 递归调用 back,从前一个元素继续查找
back(nums, start - 1, length);
}
}
// 辅助方法 swap,交换数组中的两个元素
public void swap(int[] nums, int i, int j) {
int temp = nums[i]; // 临时存储 nums[i] 的值
nums[i] = nums[j]; // 将 nums[j] 的值赋给 nums[i]
nums[j] = temp; // 将临时存储的值赋给 nums[j]
}
// 辅助方法 check,用于排序 start 位置后面的元素,确保生成最小的排列
public void check(int[] nums, int start, int length) {
// 创建一个新数组 intArray 来存储从 start+1 到数组末尾的所有元素
int[] intArray = new int[length - start - 1];
int j = 0;
// 将 start 之后的元素存入 intArray 中
for (int i = start + 1; i < length; i++) {
intArray[j] = nums[i];
j++;
}
// 对 intArray 进行排序,使其成为升序排列(最小排列)
Arrays.sort(intArray);
// 将排序后的 intArray 中的元素放回原数组 nums
j = 0;
for (int i = start + 1; i < length; i++) {
nums[i] = intArray[j];
j++;
}
}
}
但是其实过程中调试了很多次,很耗时间,这个方法有点冗杂了
我觉得可能直接转成数字说不定也会很好
然后其实还可以优化的代码在check那,这个地方本质就是一个排序,其实sort已经写好了,不过优化空间不大就是了,就是代码量少很多
然后还有更好的东西的话,我想是在翻转如果start<0
其实可以直接逆序即可,其它代码一致