解题思路:
如上图
指针i
从后往前遍历, 如果nums[i] > nums[i -1]
, 就将i
以及i
之后的元素排序
操作为Arrays.sort(nums, i, len);
- 终止点是
nums[i - 1] = 4
,nums[i] =7
- 那么将
7
以后的元素(即7 6 5 3 1
)排序
此时的数组为1 5 8 4 1 3 5 6 7
此时的i
指向4
后面的1
即nums[i] = 1
令指针j
指向i
的位置, 从此位置开始向后遍历, 找到第一个大于nums[i -1]
的数, 交换位置
- 可以发现第一个大于
nums[i -1]
(即4
) 的数是5
, 此时指针j
指向5
的位置 - 交换
nums[i -1]
和nums[j]
的位置 - 此时数组为1 5 8 5 1 3 4 6 7
末尾的Arrays.sort(nums);
操作是为了将3 2 1这种情况考虑进去, 3 2 1不符合条件nums[i] > nums[i -1]
class Solution {
public void nextPermutation(int[] nums) {
int len = nums.length;
for(int i = len - 1; i > 0; i--){
if(nums[i] > nums[i -1]){
Arrays.sort(nums, i, len);
for(int j = i; j < len; j++){
if(nums[j] > nums[i - 1]){
int tmp = nums[j];
nums[j] = nums[i - 1];
nums[i - 1] = tmp;
return;
}
}
}
}
Arrays.sort(nums);
return;
}
}