力扣1499.满足不等式的最大值
-
双端单调队列
- 将原式变形为 x~j~ + y~j~ + y~i~ - x~i~
- 枚举j ,问题变为求i<j的y~i~ - x~i~的最大值
- 有限制条件x~i~ ≥ x~j~−k
- 单调队列储存二元组(x,y-x)
cpp
class Solution {
public:
int findMaxValueOfEquation(vector<vector<int>>& points, int k) {
int ans = INT_MIN;
deque<pair<int,int>> q;
for(auto &p:points)
{
int x = p[0],y = p[1];
//如果队头元素的x不满足条件了
while(!q.empty() && q.front().first < x - k)
q.pop_front();
//如果还有满足条件的,取队头的最大值
if(!q.empty())
ans = max(ans,x + y + q.front().second);
//如果队尾元素比当前的小,之前弹掉
while(!q.empty() && q.back().second <= y - x)
q.pop_back();
q.emplace_back(x,y-x);
}
return ans;
}
};