31. Next Permutation

题目链接:https://leetcode.com/problems...

这道题就是找规律,可以看出来下一个permutation的规律是:从右往左扫,找到第一个满足:nums[i-1] < nums[i]条件的,再找到从右到左第一个比nums[i-1]大的数,把它们swap,再把所有i-1之后的数字swap即可。边界条件:1. i = nums.length - 1,这时候i-1之后只有一个值, 2. 数组一直递减,这时候i变成0,没有nums[i-1]swap,只需要swap从0到nums.length - 1的所有数。

public class Solution {
    public void nextPermutation(int[] nums) {
        int i = nums.length - 1;
        while(i > 0) {
            if(nums[i-1] < nums[i]) break;
            i--;
        }
        // i = 0, decreasing
        if(i != 0) {
            int j = nums.length - 1;
            while(j >= 0) {
                if(nums[j] > nums[i-1]) break;
                j--;
            }
            swap(nums, i-1, j);
        }
        
        // swap all elements after i-1
        int end = nums.length - 1;
        while(i < end) swap(nums, i++, end--);
    }
    
    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

lulouch13
13 声望6 粉丝