这个题目的第一步的转化很坑,也就是说我们要先想到 i<j时, yi+yj+|xi-xj| = (xj+yj) + (yi-xi)
那么也就是对于一个j,求所有的 i(i<j) 使得 (yi-xi)最大,所以我们可以套用模板一,也就是 先去掉不满足条件的(下标之差大于k的),之后维护当前 (纵坐标-横坐标) 最大的元素
class Solution {
public:
//注意要保证使得 i<j |xj-xi|<=k
//这个前提下 使得(yi-xi)最大 因为我们想要它更大,所以后来的大者是可以取代前面的小者的
int findMaxValueOfEquation(vector<vector<int>>& points, int k) {
deque<int> dq;
int ans=INT_MIN;int len=points.size();
for(int j=0;j<len;j++){
while(dq.size() && points[j][0]-points[dq.front()][0]>k){
//如果当前已经不满足 <=k 就删除掉,反正对于递增的x序列,后面更不会满足<=k
dq.pop_front();
}//出来之后满足了 <=k
if(dq.size()) ans=max(ans,points[j][0]+points[j][1]-points[dq.front()][0]+points[dq.front()][1]);
while(dq.size() && (points[j][1]-points[j][0])>=(points[dq.back()][1]-points[dq.back()][0])){
//如果说当前的 (y-x)比上一个 (y-x)要大,那么就应该把上一个去掉,因为后面的这个既满足条件,又更大,显然更优
//这样也就是说 是一个按照y-x(非严格)递减的序列
dq.pop_back();
}
dq.push_back(j);
}
return ans;
}
};