Given an array A
, partition it into two (contiguous) subarrays left
and right
so that:
- Every element in
left
is less than or equal to every element inright
. left
andright
are non-empty.left
has the smallest possible size.
Return the length of left
after such a partitioning. It is guaranteed that such a partitioning exists.
Example 1:
Input: [5,0,3,8,6]
Output: 3
Explanation: left = [5,0,3], right = [8,6]
Example 2:
Input: [1,1,1,0,6,12]
Output: 4
Explanation: left = [1,1,1,0], right = [6,12]
Note:
2 <= A.length <= 30000
0 <= A[i] <= 10^6
- It is guaranteed there is at least one way to partition
A
as described.
思路:
从左到右扫描一遍数组,用一个数组记录索引i左边出现的最大值。
然后,从右到左再扫描一遍,用另外一个数组记录索引i右边出现的最小值。
最后,比较两个数组中同一个索引i处左边的最大值与右边的最小值的情况。
int partitionDisjoint(vector<int>& A) { map<int,int>mpMax,mpMin;//对应的索引 int t = A[0]; for(int i = 0; i < A.size(); i++) { t = max(t,A[i]); mpMax[i] = t; } t = A[A.size()-1]; for(int i = A.size()-1; i >= 1; i--) { t = min(t,A[i]); mpMin[i] = t; } for(int i = 1; i < A.size(); i++) { if(mpMax[i-1] <= mpMin[i])return i; } }
参考: