下一个排列
题目
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
链接
思路
从右往左遍历数组,找到当前位比后一位小的第一个位置,记为left,若left为初始值,则说明数组完全降序,直接将数组整体反转;否则再从右往左遍历,找到比nums[left]大的第一个数,将它与nums[left]交换后,将left+1到末尾这一部分数组全部反转,即为下一个排列
class solution {
public void nextPermutation(int[] nums) {
int len = nums.length;
int left = -1;
// left为比后一位更小的数的索引
for (int i = len - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
left = i;
break;
}
}
if (left == -1) {
reverse(nums, 0, len - 1);
} else {
int right = -1;
// right为从右往左比nums[left]大的第一个数的索引
for (int j = len - 1; j > left; j--) {
if (nums[j] > nums[left]) {
right = j;
break;
}
}
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
reverse(nums, left + 1, len - 1);
}
}
// 将数组在L~R范围内反转
public void reverse(int[] nums, int L, int R) {
while (L < R) {
int tmp = nums[L];
nums[L] = nums[R];
nums[R] = tmp;
L++;
R--;
}
}
}