单调队列解法,考虑任意端点 结尾的极大子区间,其满足区间内任意一子区间都不能满足条件。之后考虑
对不满足条件区间个数的贡献,加和即可。
时间复杂度 ,空间复杂度
。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector array * @return long长整型 */ long long MaxMin(vector<int> &array) { long long r = 0; long long l = 0; deque<long long> mx; deque<long long> mi; long long ans = 0; while (r < array.size()) { while (!mx.empty() && array[r] >= array[mx.back()]) { mx.pop_back(); } mx.push_back(r); while (!mi.empty() && array[r] <= array[mi.back()]) { mi.pop_back(); } mi.push_back(r); while (array[mx.front()] >= 2 * array[mi.front()]) { l++; if (mx.front() < l) mx.pop_front(); if (mi.front() < l) mi.pop_front(); } ans += r - l + 1; r++; } return (1 + array.size()) * array.size() / 2 - ans; } };