参考题解:https://leetcode.cn/problems/next-permutation/solutions/80560/xia-yi-ge-pai-lie-suan-fa-xiang-jie-si-lu-tui-dao-
找到下一个排列,即找到下一个大于当前数的更大的数。
当没有比当前更大的数的时候,那么就返回最小的数,即直接从第0个元素进行reverse
,将降序数列(最大数)变换成升序数列(最小数)。
找到下一个大于当前数的更大的数:
- 从后往前找到第一个升序相邻数对
(i,j)
- 从后往前找到第一个比
nums[i]
大的数nums[k]
- 交换
nums[i]
和nums[k]
,此时从j
到end
一定是降序序列 - 将降序序列
[j,end)
变换成升序序列
将降序序列转换为升序序列reverse
:
将第一个元素和最后一个元素交换,将第二个元素和倒数第二个元素交换,以此类推…
class Solution {public void nextPermutation(int[] nums) {int pos = -1;int n = nums.length;for (int i = n - 1; i > 0; --i) {if (nums[i - 1] < nums[i]) {pos = i - 1;break;}}if (pos != -1) {for (int i = n - 1; i > pos; --i) {if (nums[i] > nums[pos]) {swap(nums, pos, i);break;}}}reverse(nums, pos + 1);}public void reverse(int[] nums, int k) {for (int i = k, j = nums.length - 1; i < j; ++i, --j) {swap(nums, i, j);}}public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}