力扣-31.下一个排列
题目链接
31.下一个排列
class Solution {public void nextPermutation(int[] nums) {//1.从右往左找第一个非逆序的数aint left = nums.length - 2; //这里是为了找不到顺序对的时候正好停在-1while (left >= 0 && nums[left] >= nums[left + 1]) { //一定要取等号,因为相等要继续寻找left--;}//2.从右往左找到第一个大于a的数bif (left >= 0) {int right = nums.length - 1;while (right > left && nums[right] <= nums[left]) { //取等号right--;}//3.交换a,bswap(nums, left, right);}//4.将a后面的数逆序reverse(nums, left + 1);}public void swap(int[] nums, int a, int b) {int temp = nums[a];nums[a] = nums[b];nums[b] = temp;}public void reverse(int[] nums, int begin) {int end = nums.length - 1;while (begin < end) {swap(nums, begin, end);begin++;end--;}}
}
小结:如果在步骤 1 找不到顺序对,说明当前序列已经是一个降序序列,即最大的序列,我们直接跳过步骤 2、3 执行步骤 4,即可得到最小的升序序列。