class Solution {
public void nextPermutation(int[] nums) {
if (nums == null || nums.length == 0) return;
//做一个标记,如果flag变为1,则这个数组变动过,不需要整个翻转
int flag = 0;
//从后往前遍历
for (int i = nums.length - 1; i > 0; i--) {
//如果nums[i] > nums[i - 1]
if (nums[i] > nums[i - 1]) {
//从nums[i]和后面的序列中挑选出最小的比nums[i - 1]大的数
int pick = i;
for (int j = i + 1; j < nums.length; j++) {
//这里需要判断=是为了避免相同的元素
if (nums[j] > nums[i - 1] && nums[j] <= nums[pick]) {
pick = j;
}
}
swap(nums, i - 1, pick);
reSort(nums, i);
//flag变为1,标记着改动过数组
flag = 1;
break;
}
}
//判断数组有没有变动过
if (flag == 0) reSort(nums, 0);
}
//交换两个数的位置
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
//翻转从index开始的序列,因为后面这截序列是有序递减的,只需要翻转即可,不需要重新排序
private void reSort(int[] nums, int index) {
int i = index, j = nums.length - 1;
while (i < j) {
swap(nums, i, j);
i++;
j--;
}
}
}