从后面开始推倒 最后一个是最大数, 当前位置的后一个位置是后面一段的最小数,再分别对和最小数和最大数比较,如果小于最小数直接交换两个位置的值,如果小于最大数,则从末尾开始找最前位置刚刚大于当前值,交换两个位置的值。
代码:
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; } } } }