从后面开始推倒 最后一个是最大数, 当前位置的后一个位置是后面一段的最小数,再分别对和最小数和最大数比较,如果小于最小数直接交换两个位置的值,如果小于最大数,则从末尾开始找最前位置刚刚大于当前值,交换两个位置的值。
代码:
public class Solution {
public void nextPermutation(int[] nums) {
int len = nums.length;
int min = nums[len-1], max = nums[len-1];
int minIndex = len-1, maxIndex = len - 1;
for(int i = nums.length - 1; i >= 0; i--){
if(nums[i] < min){
nums[minIndex] = nums[i];
nums[i] = min;
break;
}
if(nums[i] < max){
int j = maxIndex;
while(j >= 1 && nums[i] < nums[j-1]) j--;
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
break;
}
else{
max = nums[i];
for(int j = i; j < len-1; j++) nums[j] = nums[j+1];
nums[len-1] = max;
minIndex = i;
maxIndex = len - 1;
}
}
}
}