1. 程式人生 > >leetcode 915 分割陣列

leetcode 915 分割陣列

給定一個數組 A,將其劃分為兩個不相交(沒有公共元素)的連續子陣列 left 和 right, 使得:

  • left 中的每個元素都小於或等於 right 中的每個元素。
  • left 和 right 都是非空的。
  • left 要儘可能小。

在完成這樣的分組後返回 left 的長度。可以保證存在這樣的劃分方法。

 

示例 1:

輸入:[5,0,3,8,6]
輸出:3
解釋:left = [5,0,3],right = [8,6]

示例 2:

輸入:[1,1,1,0,6,12]
輸出:4
解釋:left = [1,1,1,0],right = [6,12]

 

提示:

  1. 2 <= A.length <= 30000
  2. 0 <= A[i] <= 10^6
  3. 可以保證至少有一種方法能夠按題目所描述的那樣對 A 進行劃分。

這題以開始理解錯題意了,以為分割後兩邊不能有相同的元素,結果提交上去就錯了。仔細一想,發現說的是左右兩個陣列不能重疊而已,即left陣列的最後一個元素的位置要在right陣列的第一個元素的位置之前。

設定一個m陣列,m[i]表示A[i]右邊所有元素的最小值,不包括A[i]。然後從左到右遍歷A,當A[i]左邊的最小值<=m[i]時,就說明找到一個符合題意要求的劃分。

class Solution {
    public int partitionDisjoint(int[] A) {
        if(A.length==2)return 1;
        int[] m = new int[A.length];
        int t = A[A.length-1];
        for(int i=A.length-2;i>=0;i--){
            t=Math.min(A[i+1],t);
            m[i]=t;
        }
        int l=0;
        int lmax=A[l];
        while(l<A.length-1){
            if(lmax<=m[l]){
                break;
            }
            else{
                l++;
                if(A[l]>lmax)lmax=A[l];
            }
        }
        return l+1;
    }
}