满足不等式的最大值【LC1499】
给你一个数组
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
的点。
新知识++
-
思路
-
转化:枚举 j j j,问题变成计算 y i − x i y_i-x_i yi−xi的最大值,其中要求 i < j i<j i<j并且 x i ≥ x j − k x_i \ge x_j-k xi≥xj−k
y i + y j + ∣ x i − x j ∣ = x j + y j + y i − x i y_i + y_j + |x_i - x_j|=x_j+y_j+y_i-x_i yi+yj+∣xi−xj∣=xj+yj+yi−xi -
实现:大根堆
使用大根堆记录二元组 [ x i , y i − x i ] [x_i,y_i-x_i] [xi,yi−xi],堆以 y i − x i y_i-x_i yi−xi降序排序,然后枚举 j j j
- 获得最值:如果堆顶元素下标与 j j j差值大于 k k k,那么将堆顶元素弹出;如果有下标差值小于等于 k k k的堆顶元素,那么判断是否需要更新答案。
- 直接入堆
-
实现:单调队列
使用单调队列记录二元组 [ x i , y i − x i ] [x_i,y_i-x_i] [xi,yi−xi],队列中元素以 y i − x i y_i-x_i yi−xi降序排列,然后枚举 j j j
- 如果队首元素下标与 j j j差值大于 k k k,那么将队首元素弹出;如果有下标差值小于等于 k k k的队首元素,那么判断是否需要更新答案
- 入队时,需要保持递减顺序,如果队尾元素小于 y j − x j y_j-x_j yj−xj,那么将队尾元素弹出,然后再进行入队【要求最大值,那么队首元素必须为最大,老员工的能力必须比新来的强】
-
单调队列
class Solution {
public int findMaxValueOfEquation(int[][] points, int k) {
int ans = Integer.MIN_VALUE;
var q = new ArrayDeque<int[]>();
for (var p : points) {
int x = p[0], y = p[1];
while (!q.isEmpty() && q.peekFirst()[0] < x - k) // 队首超出范围
q.pollFirst(); // 弹它!
if (!q.isEmpty())
ans = Math.max(ans, x + y + q.peekFirst()[1]); // 加上最大的 yi-xi
while (!q.isEmpty() && q.peekLast()[1] <= y - x) // 队尾不如新来的强
q.pollLast(); // 弹它!
q.addLast(new int[]{x, y - x});
}
return ans;
}
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/max-value-of-equation/solutions/2352457/on-dan-diao-dui-lie-fu-ti-dan-pythonjava-hhrr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 复杂度
- 时间复杂度: O ( n ) \mathcal{O}(n) O(n)
- 空间复杂度: O ( n ) \mathcal{O}(n) O(n)
堆
class Solution {
public int findMaxValueOfEquation(int[][] points, int k) {
int ans = -(1 << 30);
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> b[0] - a[0]);
for (var p : points) {
int x = p[0], y = p[1];
while (!pq.isEmpty() && x - pq.peek()[1] > k) {
pq.poll();
}
if (!pq.isEmpty()) {
ans = Math.max(ans, x + y + pq.peek()[0]);
}
pq.offer(new int[] {y - x, x});
}
return ans;
}
}
作者:ylb
链接:https://leetcode.cn/problems/max-value-of-equation/solutions/2352475/python3javacgotypescript-yi-ti-shuang-ji-dtrj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 复杂度
- 时间复杂度: O ( n log n ) \mathcal{O}(n \log n) O(nlogn)
- 空间复杂度: O ( n ) \mathcal{O}(n) O(n)