当前位置: 首页 > news >正文

leetcode 困难 —— 天际线问题(优先队列)

(思路感觉挺明显的,就是一些特殊情况得考虑清楚)

题目:
城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回 由这些建筑物形成的 天际线 。
每个建筑物的几何信息由数组 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], …]

题解:
这道题,主要就是和位置,高度相关

① 那我们如果不考虑高度,主要考虑位置,可以吗?

比如我们把高度从低到高排个序
然后按顺序考虑建筑物
相当于每次考虑当前建筑物,可以直接把之前建筑物给覆盖掉,因为之前考虑的建筑肯定更矮

好像不可行,没有数据结构可以这样操作
如果用数组直接保存每个位置当前的最高点也不行,0 <= lefti < righti <= 2^31 - 1 ,范围太大了

② 那我们如果不考虑位置,主要考虑高度,可以吗?

就是按照建筑物左边位置从左到右依次考虑建筑物,即扫描线从左到右移过去
建筑物右边位置,则通过 pair<右边高度,右边位置> 存储

建筑物右边位置放入一个集合中存储,代表当前还有这些建筑物被扫描线压到
然后考虑最高的一个(矮的会被覆盖)
所以采用优先队列
(其实有些没有被扫描线压到的也被放在了里面,可能没有及时拿出来,到时候直接对比扫描线,如果在扫描线左边,直接抛弃就可以)

然后每次扫描线移动到建筑物左边位置时,对比优先队列中,扫描线压到的最高建筑物
如果优先队列中的那个更高,则这个当前被覆盖了,把它的右边位置,扔到优先队列就没事了
如果当前建筑物的左边更高,则把这个位置当成天际线的一点,并也把它右边位置扔到优先队列里

考虑特殊情况

  1. 优先队列中的没有被扫描线压到,抛弃的时候,也可能形成天际线一点
  2. 如果多个天际线上点在同一直线上,[0, 2],[1, 2],[1, 4],例 x = 1 时,有 y = 2 和 y = 4,则需要考虑前一个点,x = 0,如果 x = 1 的 y 最大值大于 x = 0 的 y,则取 y 最大值,否则取 y 最小值

代码如下:

class Solution {
public:priority_queue<pair<int, int> > temp_right;vector<vector<int> > res_temp;vector<vector<int> > res;vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {int f = -1;vector<int> t(2);pair<int, int> flag;for(int i = 0; i < buildings.size(); i++) {while(!temp_right.empty()) {flag = temp_right.top();if(flag.second < f) {temp_right.pop();}else if(flag.second < buildings[i][0]) {temp_right.pop();while(!temp_right.empty() && flag.second > temp_right.top().second) {temp_right.pop();}if(!temp_right.empty()) {t[0] = flag.second;t[1] = temp_right.top().first;}else {t[0] = flag.second;t[1] = 0;}res_temp.push_back(t);f = t[0];}else {if(flag.first < buildings[i][2]) {t[0] = buildings[i][0];t[1] = buildings[i][2];res_temp.push_back(t);f = t[0];}break;}}if(temp_right.empty()) {t[0] = buildings[i][0];t[1] = buildings[i][2];res_temp.push_back(t);f = t[0];}temp_right.push(make_pair(buildings[i][2], buildings[i][1]));}while(!temp_right.empty()) {flag = temp_right.top();temp_right.pop();while(!temp_right.empty() && flag.second > temp_right.top().second) {temp_right.pop();}if(f <= flag.second) {if(!temp_right.empty()) {t[0] = flag.second;t[1] = temp_right.top().first;}else {t[0] = flag.second;t[1] = 0;}res_temp.push_back(t);f = t[0];}}int p = res_temp[0][0], p1 = res_temp[0][1], p2 = res_temp[0][1];for(int i = 0; i < res_temp.size(); i++) {if(res_temp[i][0] != p) {if(res.empty()) {t[0] = p;t[1] = p1;res.push_back(t);}else {if(p1 > res[res.size() - 1][1]) {t[0] = p;t[1] = p1;res.push_back(t);}else {t[0] = p;t[1] = p2;res.push_back(t);}}p = res_temp[i][0];p1 = res_temp[i][1];p2 = res_temp[i][1];}else {p1 = max(p1, res_temp[i][1]);p2 = min(p2, res_temp[i][1]);}}if(p1 > res[res.size() - 1][1]) {t[0] = p;t[1] = p1;res.push_back(t);}else {t[0] = p;t[1] = p2;res.push_back(t);}return res;}
};

相关文章:

leetcode 困难 —— 天际线问题(优先队列)

&#xff08;思路感觉挺明显的&#xff0c;就是一些特殊情况得考虑清楚&#xff09; 题目&#xff1a; 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息…...

离散数学笔记_第一章:逻辑和证明(2 )

1.2 命题逻辑的应用1.2.1 语句翻译 1.2.2 系统规范说明 1.2.3 布尔搜索 1.2.4 逻辑谜题泥巴孩子谜题骑士和流氓&#xff08;考研逻辑题&#xff09;1.1.2.5 逻辑电路1.2.1 语句翻译 &#x1f433;为啥要翻译语句&#xff1f; ➡因语言常常有二义性&#xff08;有歧义&#x…...

MFCC语音特征值提取算法

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

TencentOS3.1编译安装redis6.2.5

下载地址&#xff1a;https://redis.io/download 最近版为7.0.8&#xff0c;本次安装的是6.2.5 软件包解包并进入目录。 redis是c语言编写的&#xff0c;编译需要gcc&#xff0c;按网上资料说默认安装的gcc版本过低&#xff08;可能是4.8.5&#xff09;&#xff0c;使用rpm …...

AI顶会accepted papers list

为方便相关paper调研&#xff0c;对相关顶会文章列表和下载地址汇总&#xff0c;会议包括&#xff1a;AAAI、ACL、IJCAI、ICLR、COLING、SIGIR、WSDM、WWW、ICML、KDD、NeurIPS、CVPR、ECCV、ACM MM 2023 Accepted papers list 更新于&#xff1a;&#xff08;2022.11.24&…...

IOS逆向之frida安装

首先手机要越狱&#xff0c;这个就不说了&#xff0c;博主就是咸鱼搞了个160的苹果6&#xff0c; 自己刷到苹果6支持最新的12.5.7版本后越狱&#xff1b; 谁让他低版本&#xff0c;不支持 CrackerXI砸壳呢&#xff0c;当时你要是使用 frida-ios-dump 也是可以的&#xff1b; …...

《金山区提信心扩需求稳增长促发展行动方案》的通知

金发改规〔2023〕1号 各镇政府、街道办事处、园区管委会&#xff0c;区政府各部门、各直属单位&#xff1a; 《金山区提信心扩需求稳增长促发展行动方案》已经区委、区政府同意&#xff0c;现印发给你们&#xff0c;请认真按照执行。 附件&#xff1a;金山区提信心扩需求稳增…...

【Redis】Java客户端JedisSpringDataRedis入门(三)

&#x1f697;Redis学习第三站~ &#x1f6a9;起始站&#xff1a;【Redis】概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 在上一篇中我们学习了Redis常见命令的使用&#xff0c;显然&#xff0c;我们不可能一…...

挑选销售自动化工具应该关注什么功能?

销售自动化可以极大地提高你的生产力和效率&#xff0c;每周都为你节省时间。这样&#xff0c;你就可以把更多的时间用于完成交易&#xff0c;而减少用于行政任务的时间。市面上的销售自动化工具有很多&#xff0c;作为一般经验法则&#xff0c;以下是销售自动化工具中需要寻找…...

thread.join 是干什么的?原理是什么?

Thread.join 加了join&#xff0c;表示join的线程的修改对于join之外的代码是可见的。 代码示例&#xff1a; public class JoinDemo {private static int i 1000;public static void main(String[] args) {new Thread(()->{i 3000;}).start();System.out.println("…...

论文阅读 | Cross-Attention Transformer for Video Interpolation

前言&#xff1a;ACCV2022wrokshop用transformer做插帧的文章&#xff0c;q&#xff0c;kv&#xff0c;来自不同的图像 代码&#xff1a;【here】 Cross-Attention Transformer for Video Interpolation 引言 传统的插帧方法多用光流&#xff0c;但是光流的局限性在于 第一&…...

【C++修炼之路】22.哈希

每一个不曾起舞的日子都是对生命的辜负 哈希一.哈希概念及性质1.1 哈希概念1.2 哈希冲突1.3 哈希函数二.哈希冲突解决2.1 闭散列/开放定址法2.2 开散列/哈希桶三.开放定址法代码3.1 插入Insert3.2 查找Find3.3 删除Erase3.4 映射的改良&完整代码四.开散列代码4.1 插入Inser…...

HashMap原理(一):哈希函数的设计

目录导航哈希函数的作用与本质哈希函数设计哈希表初始容量的校正哈希表容量为2的整数次幂的缺陷及解决办法注&#xff1a;为了简化代码&#xff0c;提高语义&#xff0c;本文将HashMap很多核心代码抽出并根据代码含义为代码片段取名&#xff0c;完全是为了方便读者理解。哈希函…...

06--WXS 脚本

1、简介WXS&#xff08;WeiXin Script&#xff09;是小程序的一套脚本语言&#xff0c;结合 WXML &#xff0c;可以构建出页面的结构。 注意事项WXS 不依赖于运行时的基础库版本&#xff0c;可以在所有版本的小程序中运行。WXS 与 JavaScript 是不同的语言&#xff0c;有自己的…...

【Vue3】vue3 + ts 封装城市选择组件

城市选择-基本功能 能够封装城市选择组件&#xff0c;并且完成基础的显示隐藏的交互功能 &#xff08;1&#xff09;封装通用组件src/components/city/index.vue <script lang"ts" setup name"City"></script> <template><div class…...

C语言if判断语句的三种用法

C if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 C 语言中 if 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ }如果布尔表达式为 true&#xff0c;则 if 语句内的代码块将被执行。如果布尔表达式为 false&…...

React中echarts的封装

做大屏的时候经常会遇到 echarts 展示 在 React &#xff08;^18.2.0&#xff09; 中对 echarts &#xff08;^5.4.0&#xff09; 的简单封装 echarts 封装使用 props 说明 参数说明类型可选值默认值opts初始化传入的 opts https://echarts.apache.org/zh/api.html#echarts…...

IV测试系统3A太阳能模拟器在光伏中应用

一、概述IV测试系统3A太阳能模拟器应具备光束准直、光斑均匀、辐照稳定、且与太阳光谱匹配的特点&#xff0c;使用户可足不出户的完成需要太阳光照条件的测试。科迎法电气提供多规格高品质的太阳模拟器&#xff0c;可适用于单晶硅、多晶硅、非晶硅、染料敏化、有机、钙钛矿等各…...

Vue 中过滤器 filter 使用教程

Vue 过滤器 filter 使用教程文章目录Vue 过滤器 filter 使用教程一、过滤器1.1 过滤器使用的背景1.2 格式化时间的不同实现1.3 过滤器的使用1.4 过滤器总结一、过滤器 1.1 过滤器使用的背景 过滤器提供给我们的一种数据处理方式。过滤器功能不是必须要使用的&#xff0c;因为它…...

源码numpy笔记

参考文章 numpy学习 numpy中的浅复制和深复制的详细用法 numpy中的np.where torch.gather() Numpy的核心数据结构&#xff0c;就叫做array就是数组&#xff0c;array对象可以是一维数组&#xff0c;也可以是多维数组 array本身的属性 shape&#xff1a;返回一个元组&#xf…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...