31. 下一个排列
题解:
- 从后往前找第一个降序的点的下标 a
- 从该点x出发 往后找 第一个比该点大的数,下标为 b
- 两个数交换,然后将 a 后面的数 翻转过来
public void nextPermutation(int[] nums) {
int k = nums.length - 1;
while (k > 0 && nums[k - 1] >= nums[k]) k--;
if (k <= 0) {
reverse(nums, 0, nums.length - 1);
} else {
int t = k;
while (t < nums.length && nums[t] > nums[k - 1]) t++;
swap(nums, t - 1, k - 1);
reverse(nums, k, nums.length - 1);
}
}
public void reverse(int[] nums, int l, int r) {
while (l < r) {
swap(nums, l, r);
l++;
r--;
}
}
public void swap(int[] nums, int l, int r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}