leetcode31 - 下一個排列

題目描述

實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數空間。

題目代碼

public void nextPermutation(int[] nums) {
        int i = nums.length-2;
        // 1.從後往前尋找第一個升序對
        // 過濾降序數列
        while(i>=0 && nums[i]>=nums[i+1]){
            i--;
        }
        // (i,i+1)爲一個升序對即nums[i]<nums[i+1]

        // 2.如果i找得到,尋找儘可能小的nums[k]>num[i]
        if(i>=0){
            int k = nums.length-1;
            // 從後往前,尋找第一個大於num[i] 的 nums[k]
            while(nums[k]<=nums[i]){
                k--;
            }
            swap(nums,i,k);
        }
        // 逆置數組
        // 顯然,如果i找不到就是-1,那麼會逆置整個數組
        reverseNums(nums,i+1,nums.length-1);
    }
    private void reverseNums(int[]nums,int start,int end){
        int i=start,j=end;
        while(i<j){
            swap(nums,i,j);
            i++;
            j--;
        }
    }
    private void swap(int[]nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章