Given an array A, partition it into two (contiguous) subarrays left and right so that:
- Every element in
leftis less than or equal to every element inright. leftandrightare non-empty.lefthas 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 <= 300000 <= A[i] <= 10^6- It is guaranteed there is at least one way to partition
Aas described.
Related Topics:
Array
// OJ: https://leetcode.com/problems/partition-array-into-disjoint-intervals/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(N)
class Solution {
public:
int partitionDisjoint(vector<int>& A) {
deque<int> q; // index
int N = A.size(), mx = 0;
for (int i = 0; i < N; ++i) {
while (q.size() && A[q.back()] >= A[i]) q.pop_back();
q.push_back(i);
}
for (int i = 0; i < N; ++i) {
if (q.front() == i) q.pop_front();
mx = max(mx, A[i]);
if (mx <= A[q.front()]) return i + 1;
}
return -1;
}
};