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

[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 進行劃分。

C++解法:

class Solution {
public:
    int partitionDisjoint(vector<int>& A) 
    {
        const int Alength = A.size();
        vector<int> maxleft(Alength, 0);
        vector<int
> minright(Alength, 0); int maxValue = A[0]; for (int i = 0; i < Alength; ++i) { maxValue = max(maxValue, A[i]); maxleft[i] = maxValue; } int minValue = A[Alength - 1]; for (int i = Alength - 1; i >= 0; --i) { minValue =
min(minValue, A[i]); minright[i] = minValue; } for (int i = 1; i < Alength; ++i) { if (maxleft[i-1] <= minright[i]) { return i; } } throw nullptr; } };