网址
题目
这题意理解了好久。。一直没看懂输出怎么来的,看了讨论区才明白是要找到比当前输入刚好大的排列。
思路
我的思路一直都好直呀?
从数组的右端开始找存在右边比当前数字大的索引,若存在这样的索引,则再次寻找比当前索引值刚好大的索引交换两个值,排序索引后面的值;否则就排序整个数组。
研究了官方给的解法,发现我的解法绕了很多弯,比如寻找第一个索引,完全没必要两个循环套,只需比较相邻两个值的大小即可。找到索引i
之后,可以充分利用i
之后的值是递减的这一特性,从后往前找刚好比i
大的j
。最后的排序也是充分利用该特性,只需翻转数组即可。
来自solution的解法
public class Solution {
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
while (i >= 0 && nums[i + 1] <= nums[i]) {
i--;
}
if (i >= 0) {
int j = nums.length - 1;
while (j >= 0 && nums[j] <= nums[i]) {
j--;
}
swap(nums, i, j);
}
reverse(nums, i + 1);
}
private void reverse(int[] nums, int start) {
int i = start, j = nums.length - 1;
while (i < j) {
swap(nums, i, j);
i++;
j--;
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}