思路就是枚举分界点,然后验证左数组的最大值小于等于右数组的最小值。在遍历的同时,跟新左数组的最大值,右数组的最小值需要预处理。
class Solution {
public:
int partitionDisjoint(vector<int>& A) {
int n = A.size(), maxLeft = A[0];
vector<int> minRight(n+1,INT_MAX);
for(int i=n-1;i>=1;i--){
minRight[i] = min(minRight[i+1],A[i]);
}
for(int i=1;i<n-1;i++){
maxLeft = max(maxLeft,A[i-1]);
if(maxLeft<=minRight[i]) return i;
}
return n-1;
}
};