满足不等式的最大值

发布时间 2023-07-21 01:41:09作者: 失控D大白兔

你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标,并按照横坐标 x 的值从小到大排序。
也就是说 points[i] = [xi, yi] ,并且在 1 <= i < j <= points.length 的前提下, xi < xj 总成立。
请你找出 yi + yj + |xi - xj| 的 最大值,其中 |xi - xj| <= k 且 1 <= i < j <= points.length。
题目测试数据保证至少存在一对能够满足 |xi - xj| <= k 的点

1. 双端队列 + 单调栈

左端维护范围,右端维护单调性

class Solution {
public:
    int findMaxValueOfEquation(vector<vector<int>>& points, int k) {
        deque<int> q;
        int n = points.size();
        int res = INT_MIN;
        for(int i=0;i<points.size();i++){
            while(!q.empty()&&points[i][0]-points[q.front()][0]>k)  q.pop_front();//剔除掉不满足条件的,该点对于后面的数也不满足条件
            if(!q.empty()) res = max(res,points[i][0]+points[i][1]+points[q.front()][1]-points[q.front()][0]);//队列权值呈降序排列
            while(!q.empty() && points[q.back()][1]-points[q.back()][0] <= points[i][1]-points[i][0])  q.pop_back();//当前点权重更大,把权重小的挤出队列
            q.push_back(i);
        }
        return res;
    }
};