LeeCode 1499 单调队列

题意

传送门 LeeCode 1499. 满足不等式的最大值

题解

y i + y j + ∣ x i − x j ∣ y_i + y_j + |x_i - x_j| yi+yj+xixj 的 最大值,即对于以点 ( x i , y i ) (x_i,y_i) (xi,yi) 为右界的满足 ∣ x i − x j ∣ ≤ k |x_i - x_j|\leq k xixjk 的区间,维护使答案最大的点即可。考虑到 x i x_i xi 单调递增,则对于区间内不同的点 ( x j , y j ) , ( x k , y k ) (x_j,y_j),(x_k,y_k) (xj,yj),(xk,yk),使答案在 ( x j , y j ) , ( x i , y i ) (x_j,y_j), (x_i,y_i) (xj,yj),(xi,yi) 点对处最大,则有

y i + y j + x i − x j ≥ y i + y k + x i − x k y_i + y_j + x_i - x_j\geq y_i + y_k + x_i - x_k yi+yj+xixjyi+yk+xixk

y j + x k ≥ y k + x j y_j+x_k\geq y_k+x_j yj+xkyk+xj

单调递减队列维护即可。

class Solution
{
public:
    int findMaxValueOfEquation(vector<vector<int>> &points, int k)
    {
        int l = 0, r = -1, res = INT_MIN, n = points.size();
        vector<int> q(n);
        for (int i = 0; i < n; i++)
        {
            while (l <= r && points[i][0] - points[q[l]][0] > k) ++l;
            if (l <= r) res = max(res, points[i][1] + points[q[l]][1] + points[i][0] - points[q[l]][0]);
            while (l <= r && points[i][1] + points[q[r]][0] >= points[q[r]][1] + points[i][0]) --r;
            q[++r] = i;
        }
        return res;
    }
};

你可能感兴趣的:(数据结构)