LeetCode | 218. 天际线问题

news2025/11/15 17:55:44

城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回由这些建筑物形成的天际线 。

每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] = [lefti, righti, heighti] 表示:

lefti 是第 i 座建筑物左边缘的 x 坐标。
righti 是第 i 座建筑物右边缘的 x 坐标。
heighti 是第 i 座建筑物的高度。
你可以假设所有的建筑都是完美的长方形,在高度为 0 的绝对平坦的表面上。

天际线 应该表示为由 “关键点” 组成的列表,格式 [[x1,y1],[x2,y2],…] ,并按 x 坐标 进行 排序 。关键点是水平线段的左端点。列表中最后一个点是最右侧建筑物的终点,y 坐标始终为 0 ,仅用于标记天际线的终点。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。

注意:输出天际线中不得有连续的相同高度的水平线。例如 […[2 3], [4 5], [7 5], [11 5], [12 7]…] 是不正确的答案;三条高度为 5 的线应该在最终输出中合并为一个:[…[2 3], [4 5], [12 7], …]

示例 1:
在这里插入图片描述

输入:buildings = [[2,9,10],[3,7,15],[5,12,12],[15,20,10],[19,24,8]]
输出:[[2,10],[3,15],[7,12],[12,0],[15,10],[20,8],[24,0]]
解释:
图 A 显示输入的所有建筑物的位置和高度,
图 B 显示由这些建筑物形成的天际线。图 B 中的红点表示输出列表中的关键点。
示例 2:

输入:buildings = [[0,2,3],[2,5,3]]
输出:[[0,3],[5,0]]

提示:

  • 1 <= buildings.length <= 104
  • 0 <= lefti < righti <= 231 - 1
  • 1 <= heighti <= 231 - 1
  • buildings 按 lefti 非递减排序

思路:扫描线加优先队列。
对于本题,对应的扫描线分割形状如图:
在这里插入图片描述
扫描线根据 x 大小排序,从左往右遍历。
维护一个优先队列,优先队列中保存建筑的右坐标和高度。遍历竖线,当竖线的 x 坐标在建筑的区间 [ l , r ) [l, r) [l,r) 中时,建筑添加优先队列中;当竖线在 [ r , + ∞ ) [r, +\infty) [r,+) 时,建筑出优先队列(当建筑的高度不是优先队列中最高的时,会延迟移出队列,但是因为建筑不是最高,所以不会影响结果)。

vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
    auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) -> bool { return a.second < b.second; };
    priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> que(cmp);

    vector<int> boundaries;
    for (auto& building : buildings) {
        boundaries.emplace_back(building[0]);
        boundaries.emplace_back(building[1]);
    }
    sort(boundaries.begin(), boundaries.end());

    vector<vector<int>> ret;
    int n = buildings.size(), idx = 0;
    for (auto& boundary : boundaries) {
        while (idx < n && buildings[idx][0] == boundary) { // 用 while 是因为可能出现多根竖线重合的情况
            que.emplace(buildings[idx][1], buildings[idx][2]);
            idx++;
        }
        while (!que.empty() && que.top().first <= boundary) { // 当竖线不在建筑的区间中(竖线的x坐标大于或等于建筑的右边坐标)时,建筑移除优先队列
            que.pop();
        }

        int maxn = que.empty() ? 0 : que.top().second;
        if (ret.size() == 0 || maxn != ret.back()[1]) { //只要和前面一个关键点的y值不一样,就是新的关键点
            ret.push_back({boundary, maxn});
        }
    }
    return ret;
}

// 
vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
    vector<vector<int>> res;
    int cur = 0, cur_X, cur_H, len = buildings.size();
    priority_queue<pair<int, int>> liveBlg; // 保存高度 和 y 坐标
    while (cur < len || !liveBlg.empty()) {
        cur_X = liveBlg.empty() ? buildings[cur][0] : liveBlg.top().second; 

        if (cur >= len || buildings[cur][0] > cur_X) { // 所有的建筑遍历完,或者当前建筑的x坐标比竖线要大,前面遍历完的建筑要出队列
            while (!liveBlg.empty() && liveBlg.top().second <= cur_X) {
                liveBlg.pop(); 
            }
        } else { 
            cur_X = buildings[cur][0];
            while (cur < len && buildings[cur][0] == cur_X) { //竖线在建筑的左坐标上时,建筑添加到优先队列
                liveBlg.emplace(buildings[cur][2], buildings[cur][1]);
                cur++;
            }
        }
        cur_H = liveBlg.empty() ? 0 : liveBlg.top().first;
        if (res.empty() || (res.back()[1] != cur_H)) {
            res.push_back({cur_X, cur_H});
        }
    }
    return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Egg如何实现文件上传

文件上传是开发中不可避免的一项。那么在没有单独的资源服务器的时候&#xff0c;上传的文件可能要放在我们的项目文件夹服务器上&#xff0c;我们如何实现文件上传呢&#xff1f; 首先不用想&#xff0c;我们需要一个测试页面。html用来上传文件。如下&#xff1a; <!DOCT…

D. Minimal Height Tree(如何BFS遍历序列使树的高度最小)

Problem - 1437D - Codeforces Monocarp有一棵由n个顶点组成的树&#xff0c;它的根在顶点1。他决定研究BFS&#xff08;宽度优先搜索&#xff09;&#xff0c;所以他在他的树上运行BFS&#xff0c;从根开始。BFS可以用下面的伪代码来描述。 a [] # 顶点被处理的顺序 q Queu…

mdr1基因寡核苷酸/酸敏感靶多肽/聚乙二醇埃博霉素B偶联阿霉素的相关制备

小编这里整理了mdr1基因寡核苷酸/酸敏感靶多肽/聚乙二醇埃博霉素B偶联阿霉素的相关内容&#xff0c;一起来看&#xff01; 聚乙二醇埃博霉素B偶联阿霉素相关研究&#xff1a; 阿霉素与酰肼聚乙二醇羧基在磷酸的作用下反应制得阿霉素聚乙二醇羧基中间体,其中阿霉素与磷酸的摩尔比…

Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)

运行有问题或需要源码请 点赞关注收藏后评论区留言~~~ 一、上下滚动与左右滑动的冲突处理 Android控件繁多&#xff0c;允许滚动或滑动操作的视图也不少&#xff0c;如果开发者要自己接管手势处理&#xff0c;那么这个页面的滑动就存在冲突的情况&#xff0c;如果系统响应了A视…

贴花、射线、动画通知——足迹01

案例实现效果&#xff1a; 人物跑步留下脚印&#xff08;其他运动留下脚印也是同理&#xff09;。 重点&#xff1a; 贴花的创建、射线、动画通知。射线碰撞决定贴花生成位置&#xff0c;动画通知决定贴花生成时间。 一、贴花 1、贴花纹理图 在网络上找素材&#xff08…

JavaSE之动态代理

目录动态代理动态代理的好处Proxy重写invoke方法实例最后动态代理 动态代理需要确定要代理的对象&#xff0c;所以需要先new一个要代理的对象 动态代理的好处 可以在不改变方法源码的情况下&#xff0c;实现对方法功能的增强。 简化了代码。 提高了软件系统的可扩展性。 P…

【TensorRT】神经网络中的量化

文章目录一、TensorRT 为什么需要量化二、基础内容三、神经网络的量化过程一、TensorRT 为什么需要量化 量化是什么&#xff1a;量化在数字信号处理领域&#xff0c;是指将信号的连续取值&#xff08;或者大量可能的离散取值&#xff09;近似为有限多个&#xff08;或较少的&a…

七彩动态|棱镜七彩获“北京国家金融科技认证中心”颁发的「金融开源技术服务商能力评估证书」

11月13日&#xff0c;由北京金融科技产业联盟举办的第二届会员大会第四次会议在北京召开。 聚焦开源应用与安全&#xff0c;棱镜七彩通过北京国家金融科技认证中心“金融业开源评估”—金融开源技术服务商能力评估&#xff0c;并获得由北京国家金融科技认证中心颁发的“金融开…

对梯度回传的理解

参考 对梯度回传的理解 - 云社区 - 腾讯云 神经网络的每一层可以看做是使用一个函数对变量的一次计算。在微分中链式法则用于计算复合函数的导数。反向传播时一种计算链式法则的算法&#xff0c;使用高效的特定运算顺序。 设x是实数&#xff0c;f和g是从实数映射到实数的函数。…

分享一个单片机GUI库,简洁,使用

1-介绍一下 先来几张图&#xff1a; 看着是不是还不错。这个是一个国外的爱好者开发的&#xff0c;笔者有次逛网站&#xff0c;搜GUI看到的没感觉还不错&#xff0c;今天特意给大家分享一下。 这个GUI是一个用于嵌入式系统的免费开源图形库。平台独立的&#xff0c;也就是说可…

OVN 流表基础 -- 基于 kubeOVN (二)

文章目录功能流表加 Pod加子网跨子网 pod 互访访问外部网络DHCP静态路由策略路由安全组DNATLBFullNAT LBService 扩展Src-ip LB功能流表 基于此模型配置功能&#xff0c;来查看流表变化&#xff0c;探讨功能实现方式。 加 Pod 流表添加&#xff1a; Datapath: "ovn-cl…

《Eolink 征文活动- -RESTful接口全解测试-全方位了解Eolink》

目录 Eolink平台首页 Eolink平台下载地址 一、自带环境示例【GET】|【POST】 示例项目&#xff1a; 完成Get请求示例&#xff1a; 完整POST请求示例&#xff1a; 二、自建接口测试【PUT】|【DELETE】 RESTful协议/方法 创建PUT&DELETE的API接口&#xff1a; PUT协…

【linux】虚拟化

linux虚拟化 文章目录linux虚拟化实验环境安装虚拟化服务安装虚拟机遇到报错效果虚拟机管理命令移植虚拟机虚拟机快照由快照创建虚拟机实验环境 1号虚拟机配置局域网镜像仓库&#xff0c;httpd服务2号虚拟机保证可以使用dnf搜索到1号的镜像仓库 安装虚拟化服务 查看是否支持v…

代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

目录 动态规划理论基础 509. 斐波那契数 思路 斐波那契数 递归思路 动态规划 动态规划(优化数组) 70. 爬楼梯 思路 爬楼梯 动态规划(优化数组) 动态规划(变量替代数组) 746. 使用最小花费爬楼梯 思路 使用最小花费爬楼梯 动态规划(使用数组) 动态规划(使用变量) 动态规划理论基…

顺风车用户最爱“送花”城市Top30 出炉,来看有没有你的家乡?

11月18日&#xff0c;嘀嗒小红花迎来“一周岁生日”&#xff0c;嘀嗒出行也于当日正式发布《嘀嗒小红花一周年出行人文报告》。《报告》显示&#xff0c;自2021年11月18日&#xff0c;嘀嗒出行“送你一朵小红花”产品功能上线至今&#xff0c;嘀嗒顺风车乘客已向车主送出239万朵…

商品720vr全景环物制作便捷推送到全世界

720vr全景的应用范围也得到了扩大和普及。VR全景作为新一代信息技术&#xff0c;相较于传统的图文视频等展现方式而言&#xff0c;VR全景不仅能够帮助用户随时随地身临其境的进行沉浸式体验&#xff0c;也可以帮助商家有效降低宣传推广成本。 720VR全景制作拍摄VR全景需要用到相…

德国药品数据库查询系统(含网址)

德国曾经有被誉为世界’医药基地’的称号。在2020年时德国药品出口额有近千亿美元&#xff0c;占世界药品出口总额的近七分之一&#xff0c;连续18年为居世界第一位&#xff0c;不仅仅是销量&#xff0c;德国生物医药行业在心脏、血液循环、糖尿病、癌症等疾病的研究、预防、基…

用Python计算点估计预测评价指标(误差指标RMSE、MSE、MAE、MAPE) ,画图展示

机器学习的回归问题常用RMSE&#xff0c;MSE, MAE,MAPE等评价指标&#xff0c;还有拟合优度R2。由于每次预测出来的预测值再去和原始数据进行误差评价指标的计算很麻烦&#xff0c;所以这里就直接给出他们五个指标的计算函数。把每次预测出来的值和真实值输入这个函数就可以得到…

对话钱江机器人丨国产化破风,谁动了工业机器人厂商的“奶酪”?

工业机器人的研发、制造和应用是衡量一国科技创新和高端制造水平的重要标志&#xff0c;是“制造业皇冠顶端的明珠”&#xff0c;亦是硬科技技术行列中的“课代表”。 《中国机器人产业发展报告&#xff08;2022年&#xff09;》预计&#xff0c;2022年全球机器人市场规模将达…

抗心血管疾病、内分泌信号通路等小分子化合物库介绍

心血管疾病 不少人认为经常熬夜&#xff0c;工作压力大是猝死的主要原因&#xff0c;其实猝死的根本原因是心血管突发病。 心血管疾病是心脏和血管疾病的统称&#xff0c;主要包括冠心病&#xff0c;脑血管疾病&#xff0c;周围末梢动脉血管疾病&#xff0c;先天性心脏病及深…