题目链接
java
class Solution {
public void nextPermutation(int[] nums) {
//1.从右往左找第一个非逆序的数a
int left = nums.length - 2; //这里是为了找不到顺序对的时候正好停在-1
while (left >= 0 && nums[left] >= nums[left + 1]) { //一定要取等号,因为相等要继续寻找
left--;
}
//2.从右往左找到第一个大于a的数b
if (left >= 0) {
int right = nums.length - 1;
while (right > left && nums[right] <= nums[left]) { //取等号
right--;
}
//3.交换a,b
swap(nums, left, right);
}
//4.将a后面的数逆序
reverse(nums, left + 1);
}
public void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
public void reverse(int[] nums, int begin) {
int end = nums.length - 1;
while (begin < end) {
swap(nums, begin, end);
begin++;
end--;
}
}
}
小结:如果在步骤 1 找不到顺序对,说明当前序列已经是一个降序序列,即最大的序列,我们直接跳过步骤 2、3 执行步骤 4,即可得到最小的升序序列。