leetcode 915 分割陣列
阿新 • • 發佈:2018-11-21
給定一個數組 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]
提示:
2 <= A.length <= 30000
0 <= A[i] <= 10^6
- 可以保證至少有一種方法能夠按題目所描述的那樣對
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; } }