【每日一题】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;
}
};