一 思路
1. 首先这道题的题意都没弄明白,没能够读懂题意;看评论才知道原来是干什么的;就是进行一个数组内,求出下一个比其大的排列 例如: [1,2,3] 比他大的是 [1,3,2] [2,1,3] [2,3,1] [3,1,2] [3,2,1]然后要求是尽可能小 只能位[1,3,2]
所以,可以看成为是 从尾部找到相邻的递增区域,然后进行和区域内第一个大于递增位置交换,最后进行递增遍历区域内数组
二 问题难点
关键是要明白题目中的含义,加上各个数组内的反转情况。
三 结果
/**
* 寻找下一个排列数组
*
* @param nums
*/
public static void nextPermutation(int[] nums) {
int i = nums.length - 2;
//找到相邻的递增的区域
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
//找到了 相邻左小右大的位置
if (i >= 0) {
int j = nums.length - 1;
while (j >= 0 && nums[i] >= nums[j]) {
j--;
}
swap(nums, i, j);
}
reverse(nums, i + 1);
}
//进行从i+1位置开始反转位升序
private static void reverse(int[] nums, int start) {
int left = start;
int right = nums.length - 1;
while (left < right) {
swap(nums, left, right);
left++;
right--;
}
}
private static void swap(int[] nums, int i, int j) {
//进行交换位置
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}