当前位置:网站首页>1499. 满足不等式的最大值 堆/双端队列
1499. 满足不等式的最大值 堆/双端队列
2022-08-10 08:23:00 【钰娘娘】
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^5points[i].length == 2-10^8 <= points[i][0], points[i][1] <= 10^80 <= k <= 2 * 10^8- 对于所有的
1 <= i < j <= points.length,points[i][0] < points[j][0]都成立。也就是说,xi是严格递增的。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/max-value-of-equation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题结果
成功,堆,后面参考标签单调队列
方法1:堆
yi + yj + |xi - xj|,因为xi<xj,所以这个式子和变为 yi+yj+(xj-xi)=(xj+yj)+(yi-xi)
主要特点是采取了懒删除策略,保存前面索引的位置与 yi-xi,按 yi-xi从大到小排序堆
1. 把堆顶和x距离太远的删掉(懒删除)
2. 非空情况比较 max(yi+yj+堆顶,ans)
3. 当前元素 {xi,yi-xi} 加入堆
class Solution {
public int findMaxValueOfEquation(int[][] points, int k) {
PriorityQueue<int[]> pq= new PriorityQueue<>((a,b)->b[1]-a[1]);
int n = points.length;
int ans = Integer.MIN_VALUE;
for(int i = 0; i < n; i++){
int[] point = points[i];
while (!pq.isEmpty()&&point[0]-pq.peek()[0]>k) pq.poll();
if(!pq.isEmpty()) ans = Math.max(ans,point[0]+point[1]+pq.peek()[1]);
pq.offer(new int[]{point[0],point[1]-point[0]});
}
return ans;
}
}时间复杂度:O(nlogn)
空间复杂度:O(n)
方法2:双端队列(单调队列)
1. 考虑两个情况:
- 新的值比旧的值小,新的值可能作为有效值算到答案中吗?可能。前面旧值出队,新的值可能变成最大
- 新的值比旧的值大,旧的值可能作为有效值到答案中吗?不可能。前面旧值出队,新的值还没出队,所以旧值无效了。
2. 综上,本题维护一个单调下降即可。最大值在最前,最小值最后。前面的值距离超出就出队,后面的值比新值小的就出队,然后新的值加在队列的末尾。这样就用O(n) 的复杂度维护了和堆一样拿到最大值得效果。
class Solution {
public int findMaxValueOfEquation(int[][] points, int k) {
int n = points.length;
int[] deque = new int[n];
int start = 0;
int end = 0;
int ans = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
int[] point = points[i];
while (end!=start && point[0] - points[deque[start]][0] > k) ++start;
if (end!=start) ans = Math.max(ans, point[0] + point[1] + (points[deque[start]][1]-points[deque[start]][0]));
int v = point[1] - point[0];
while (end!=start && points[deque[end-1]][1]-points[deque[end-1]][0] < v)--end;
deque[end++]=i;
}
return ans;
}
}时间复杂度:O(n)
空间复杂度:O(n)
边栏推荐
- [In-depth study of 4G/5G/6G topic-56]: L3 signaling control-5-radio bearer management
- [Learn Rust together | Advanced articles | RMQTT library] RMQTT message server - installation and cluster configuration
- VS2013-调试汇编代码-生成asm文件-结构体内存布局-函数参数压栈-调用约定
- 大体来讲,网站会被攻击分为几种原因
- Johnson全源最短路
- Rust学习:6.3_复合类型之元组
- Uni-app开发微信小程序使用本地图片做背景图
- PLSQL学习第三天
- FFT模板
- Power function Exponential function Logarithmic function
猜你喜欢

PLSQL学习第三天

The sixteenth day & the basic operation of charles

【转】探秘钉钉的即时消息服务DTIM

卷积神经网络卷积层公式,卷积神经网络运算公式

如何远程调试对方的H5页面

CV+Deep Learning——网络架构Pytorch复现系列——classification(三:MobileNet,ShuffleNet)

初使jest 单元测试

Based on STC8G2K64S4 single-chip microcomputer to display analog photosensitive analog value through OLED screen

iwemeta元宇宙:阿里首任COO:如何打造销售铁军

每日一题,数组字符串的匹配问题
随机推荐
PLSQL学习第三天
NPU架构与算力分析
短视频同城流量宣传小魔推有何优势?如何给实体商家带来销量?
Power function Exponential function Logarithmic function
【Unity入门计划】2D游戏实现敌人来回移动控制脚本
NPU architecture and force analysis
机器人控制器编程实践指导书旧版-实践一 LED灯(数字量)
【Unity入门计划】Collision2D类&Collider2D类
Guys, may I ask, the oraclecdc error report is not serialized, but I see that the source code does not inherit serialization, what is the reason?
SQL SERVER 数据库,表的数据发生增删改,该表的索引会在ldf日志中记录吗?
2022-08-01 网工进阶(二十四) STP进阶知识
1-31部 1-31套 和硬件工程师90天学习资料及笔记汇总
UGUI - Events, iTween Plugin
Summary of ctfshow SSTI knowledge points
阿里云数据库 RDS SQL Server 版的服务器绑定域名www.cxsdkt.cn.的呢?
Compilation failure:找不到符号
Synchronization lock synchronized traces the source
Docker搭建Mysql一主一从
Class Notes (7) (1) - #647. Find the root and the child (root)
Rust学习:6.2_复合类型之元组