31. Next Permutation

# Hard

  • Find the element should be replaced, [1, 2, 7, 6, 5, 4], 2 is the number.

  • find the element just a little larger than 2, swap(2, 4) --- can save time

  • reverse [7, 6, 5, 2]

  • result -> [1, 2, 4, 2, 5, 6, 7]

class Solution {
    public void nextPermutation(int[] nums) {
        if(nums.length == 1) return;
        
        // [i, -1] should be rearranged
        int i = nums.length - 2;
        for(; i >= 0; i --) 
            if(nums[i] < nums[i+1]) 
                break;
        
        // find the index j which number is just bigger than nums[i]
        Arrays.sort(nums, i+1, nums.length);
        if(i == -1) return;  // [3, 2, 1]
        
        int j = insertPosition(nums, i+1, nums[i]);
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    
    private int insertPosition(int[] nums, int i, int goal) {
        int left = i, right = nums.length - 1;
        while(left < right) {
            int mid = left + (right - left)/2;
            if(goal >= nums[mid])
                left = mid +1;
            else
                right = mid;
        }
        return left;
    }
}

Last updated