Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
1,7,6,5,4,3 -> 3,1,4,5,6,7
7,6,5,8,3 ->  7,6,8,3,5

这里实际上是找下一个更大的数字。比如1,2,3 我们很容易知道下一个数字是1,3,2。
从尾到头找,第一段ascending的部分出现。后面的部分就可以有更大的组合。

  i        
9 1 7 5 4 3
          j  
9 3 7 5 4 1
    i+1
9 3 1 4 5 7

  i
9 6 7 5 4 3
    j
9 7 6 5 4 3
    i+1
9 7 3 4 5 6
public class Solution {
    public void nextPermutation(int[] nums) {
        if(nums.length <= 1) return;
        
        int i = nums.length - 2;
        
        // 找到尾部的第一段递减序列。
        while(i >= 0 && nums[i] >= nums[i+1]){
            i--;
        }
        
        if(i >= 0){
            int j = nums.length - 1;
            // 这里是在递减序列中找到下一个比nums[i]大的数字,作为序列的头。
            while(i < j && nums[j] <= nums[i]){
                j--;
            }
            swap(nums, i, j);
        }
        // 尾部的递减序列变成递增序列。
        reverse(nums, i+1, nums.length-1);
        
    }
    
    public void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    
    public void reverse(int[] nums, int i, int j){
        while(i < j){
            swap(nums, i, j);
            i++;
            j--;
        }
    }
}

大米中的大米
12 声望5 粉丝

你的code是面向面试编程的,收集和整理leetcode discussion里个人认为的最优且最符合我个人思维逻辑的解法。