1. 程式人生 > >LeetCode:下一個排列【31】

LeetCode:下一個排列【31】

-- 技術分享 wid 必須 targe col int close ace

LeetCode:下一個排列【31】

題目描述

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

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

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

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,31,3,2
3,2,11,2,3
1,1,51,5,1

題目分析

什麽樣的排列將產生下一個更大的數字呢?

  技術分享圖片

  觀察上面這個圖,我們需要將數字 a[i-1]替換為位於其右側區域的數字中比它更大的數字,例如 a[j]。我們交換數字 a[i-1]a[j]。我們現在在索引

i-1處有正確的數字

  但目前的排列仍然不是我們正在尋找的排列。我們需要通過僅使用 a[i-1]右邊的數字來形成最小的排列因此,我們需要放置那些按升序排列的數字,以獲得最小的排列。

具體的操作如下:

  技術分享圖片

Java題解

class Solution {
    public void nextPermutation(int[] nums) {
        int i = nums.length-2;
        while(i>=0&&nums[i+1]<=nums[i])
            i--;
        if(i>=0)
        {
            int j = nums.length-1;
            while(j>=0&&nums[j]<=nums[i])
                j--;
            swap(nums,i,j);
        }
        reverse(nums,i+1);
        
    }
    
    
    private void reverse(int[] nums, int start) {
        int i = start, j = nums.length - 1;
        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;
    }
}

  

LeetCode:下一個排列【31】