https://leetcode-cn.com/problems/next-permutation/
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例:
输入:nums = [1,2,3] 输出:[1,3,2]
解法:
package leetcode2;
/**
* 2021/3/10 16:28
*
* @Author ayue
*/
public class Solution31 {
public void nextPermutation(int[] nums) {
//以排列 [4,5,2,6,3,1] 为例:
//我们能找到的符合条件的一对「较小数」与「较大数」的组合为 22 与 33,满足「较小数」尽量靠右,而「较大数」尽可能小。
//当我们完成交换后排列变为 [4,5,3,6,2,1],此时我们可以重排「较小数」右边的序列,序列变为 [4,5,3,1,2,6]。
int index = nums.length - 2;
while (index >= 0 && nums[index] >= nums[index + 1]) {
--index;
}
if (index >= 0) {
int j = nums.length - 1;
while (j >= 0 && nums[j] <= nums[index]) {
--j;
}
swap(nums, index, j);
}
++index;
int len = nums.length - 1;
while (index < len) {
swap(nums, index, len);
++index;
--len;
}
}
private void swap(int[] arr, int i, int j) {
arr[i] ^= arr[j];
arr[j] ^= arr[i];
arr[i] ^= arr[j];
}
public static void main(String[] args) {
int[] nums = new int[]{3, 2, 1};
Solution31 solution31 = new Solution31();
solution31.nextPermutation(nums);
for (int i : nums) {
System.out.println(i);
}
}
}