题目:31. 下一个排列
思路:
- 从右向左找到第一个右侧数字比自身大的数字,该位置记为
indexLeft
;若找不到,说明是最后一个排列,直接跳到第4步; - 从右向左找到第一个大于该数字的数字,该位置记为
indexRight
; - 交换二者的位置;
indexLeft
右侧的数字序列反序。
代码:
class Solution {
public void nextPermutation(int[] nums) {
int indexLeft = -1;
for (int i = nums.length - 2; i >= 0; i--) {
if (nums[i + 1] > nums[i]) {
indexLeft = i;
break;
}
}
if (-1 != indexLeft) {
int indexRight = nums.length - 1;
while (indexRight >= 0 && nums[indexRight] <= nums[indexLeft]) {
indexRight--;
}
// swap
int temp = nums[indexLeft];
nums[indexLeft] = nums[indexRight];
nums[indexRight] = temp;
}
// reverse
int left = indexLeft + 1;
int right = nums.length - 1;
while (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left ++;
right --;
}
}
}