【每日一题】1499. 满足不等式的最大值

【每日一题】1499. 满足不等式的最大值

1499. 满足不等式的最大值

题目描述

给你一个数组 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:

输入:points = [[1,3],[2,0],[5,10],[6,-10]], k = 1
输出:4
解释:前两个点满足 |xi - xj| <= 1 ,代入方程计算,则得到值 3 + 0 + |1 - 2| = 4 。第三个和第四个点也满足条件,得到值 10 + -10 + |5 - 6| = 1 。
没有其他满足条件的点,所以返回 4 和 1 中最大的那个。

示例 2:

输入:points = [[0,0],[3,0],[9,2]], k = 3
输出:3
解释:只有前两个点满足 |xi - xj| <= 3 ,代入方程后得到值 0 + 0 + |0 - 3| = 3 。

提示:

2 <= points.length <= 10^5
points[i].length == 2
-10^8 <= points[i][0], points[i][1] <= 10^8
0 <= k <= 2 * 10^8
对于所有的1 <= i < j <= points.length ,points[i][0] < points[j][0] 都成立。也就是说,xi 是严格递增的。

解题思路

思路:yi+yj+|xi-xj|可以转换为yi+yj+xj-xi,即为xj+yj+(yi-xi),即对于每一个点(xj,yj),求其前面的坐标(xi,yi)的yi-xi的最大值,并且该点满足xj-xi<=k。xj-xi<=k相当于控制队列的移动,yi-xi相当于求最大值,那么就可以使用单调队列。使用deque维护单调队列,由于存在两个信息x和y-x,故使用pair<int,int>存储这两个信息。遍历数组points,提取出当前坐标(x,y),首先将不满足xj-xi<=k的数据清掉,然后更新xj+yj+(yi-xi)的 最大值,接着将当前{y-x,x}加入单调队列并维护单调性。注意,该题是两个维度。

class Solution {
public:
    int findMaxValueOfEquation(vector<vector<int>>& points, int k) {
        // x y-x x按照顺序 
        using pii=pair<int,int>;
        deque<pii> dque;
        int res=INT_MIN;
        for(auto point:points)
        {
            int x=point[0],y=point[1];
            // 不符合x2-x1<=k
            while(!dque.empty()&&dque.front().first<x-k)
                dque.pop_front();
            // 收集结果
            if(!dque.empty())
                res=max(res,x+y+dque.front().second);
            //加等于是考虑到x
            while(!dque.empty()&&dque.back().second<=y-x)
                dque.pop_back();
            dque.push_back({x,y-x});
        }
        return res;
    }
};
class Solution {
public:
    int findMaxValueOfEquation(vector<vector<int>>& points, int k) {
        // y-x x y-x按照顺序 
        using pii=pair<int,int>;
        deque<pii> dque;
        int res=INT_MIN;
        for(auto point:points)
        {
            int x=point[0],y=point[1];
            // 不符合x2-x1<=k
            while(!dque.empty()&&dque.front().second<x-k)
                dque.pop_front();
            // 收集结果
            if(!dque.empty())
                res=max(res,x+y+dque.front().first);
            //加等于是考虑到x
            while(!dque.empty()&&dque.back().first<=y-x)
                dque.pop_back();
            dque.push_back({y-x,x});
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值