leetcode 31 Next Permutation

題目詳情

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.

題目的意思是找到當前元素排列的‘下一個排列’。那麼什麼叫‘下一個排列呢’?這裏舉個例子,好比說元素1,2,3。它們的全排列是‘1,2,3’,‘1,3,2’,‘2,1,3’,‘2,3,1’,‘3,1,2’,‘3,2,1’所以好比求‘123’的下一個排列,就應該返回‘1,3,2’.
若是當前的序列不存在‘下一個排列’,那麼就返回徹底升序的第一個排列。數組

例子: 左側一列是輸入,右側是正確的輸出:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1spa

想法

  • 當咱們要求一個排列的‘下一個排列’,咱們須要意識到問題的關鍵在於從數組末端遍歷到的,第一個不知足nums[i] <= nums[i+1]條件的元素。
  • 咱們所找到的這個元素就是排序須要改變的第一個元素。
  • 而後咱們選取一個恰好大於此元素的數,與當前元素進行替換。並對後面的全部元素從新按照升序排列就能夠獲得最終的答案。
  • 我描述的不是很清晰,這裏引用一張leetcode上的圖講解

31_Next_Permutation.gif

解法

public void nextPermutation(int[] nums) {
        int length = nums.length;
        int i= length-2;
        while(i>=0 && nums[i+1] <= nums[i])i--;
        if(i >= 0){
            int j = length -1;
            while(j >= 0 && nums[j] <= nums[i])j--;
            swap(nums,i,j);
        }
        reverse(nums,i+1);
    }
    
    public void reverse(int[] nums,int start){
        int end = nums.length-1;
        while(start < end){
            swap(nums,start,end);
            start ++;
            end --;
        }
    }
    
    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
相關文章
相關標籤/搜索