当前位置: 首页 > 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…...

【VUE】六 路由和传值

目录 一、 路由和传值 二、案例 三、案例存在无法刷新问题 一、 路由和传值 当某个组件可以根据某些参数值的不同&#xff0c;展示不同效果时&#xff0c;需要用到动态路由。 例如&#xff1a;访问网站看到课程列表&#xff0c;点击某个课程&#xff0c;就可以跳转到课程详…...

ChatGPT修炼指南和它的电力畅想

近期&#xff0c;ChatGPT刷屏各大社交平台&#xff0c;无疑成为人工智能界最靓的仔&#xff01; 身为一款“会说话”的聊天机器人程序&#xff0c;它与前辈产品Siri、小度、微软小冰等有什么不同&#xff1f;先来听听小伙伴们怎么说。 ChatGPT何以修炼得这么强大&#xff1f;…...

基于vscode开发vue项目的详细步骤教程

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 目录 五、vscode集成npm开发vue项目 1、vscode安装所需要的插件&#xff1a; 2、搭建一个vue小页面(入门vue) 3、大致理解…...

【C++初阶】1. C++入门

1. 前言 1. 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机界提出了OOP(…...

数据结构与算法(二十)快速排序、堆排序(四)

数据结构与算法&#xff08;三&#xff09;软件设计(十九)https://blog.csdn.net/ke1ying/article/details/129252205 排序 分为 稳定排序 和 不稳定排序 内排序 和 外排序 内排序指在内存里&#xff0c;外排序指在外部存储空间排序 1、排序的方法分类。 插入排序&#xff…...

TensorRT量化工具pytorch_quantization代码解析(二)

有些地方看的不是透彻&#xff0c;后续继续补充&#xff01; 继续看张量量化函数&#xff0c;代码位于&#xff1a;tools\pytorch-quantization\pytorch_quantization\tensor_quant.py ScaledQuantDescriptor 量化的支持描述符:描述张量应该如何量化。QuantDescriptor和张量…...

buu [BJDCTF2020]easyrsa 1

题目描述 &#xff1a; from Crypto.Util.number import getPrime,bytes_to_long from sympy import Derivative from fractions import Fraction from secret import flagpgetPrime(1024) qgetPrime(1024) e65537 np*q zFraction(1,Derivative(arctan(p),p))-Fraction(1,Deri…...

taobao.user.openuid.getbyorder( 根据订单获取买家openuid )

&#xffe5;免费不需用户授权 根据订单获取买家openuid&#xff0c;最大查询30个 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, secret); UserOpenuidGetbyorderR…...

Mac iTerm2 rz sz

1、安装brew&#xff08;找了很多&#x1f517;&#xff0c;就这个博主的好用&#xff09; Mac如何安装brew&#xff1f;_行走的码农00的博客-CSDN博客_mac brew 2、安装lrzsz brew install lrzsz 检查是否安装成功 brew list 定位lrzsz的安装目录 brew list lrzsz 执…...

高通平台开发系列讲解(Sensor篇)Gsensor基础知识

文章目录 一、什么是SENSOR?二、Sensor的分类及作用三、Gsensor的工作原理及介绍3.1、常见Gsensor3.2、Gsensor的特性沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 Sensor 基础 一、什么是SENSOR? 传感器(英文名称:sensor )是一种检测装置,能感…...

国外的专业性网站/如何免费引流推广

图书管理网站的制作详解&#xff08;个人学习django框架的笔记&#xff09; 第01号笔记最终成果图&#xff1a; 当前笔记所完成的网站的功能简介&#xff1a; 1 网页从数据库获得图书名称 2 点击新增按钮后增加一本书&#xff0c;当前名为“流星蝴蝶剑” 3 点击新增后当前页面…...

关于做美食的网站/沪深300指数是什么意思

git clone git://124.193.128.166/nsd1804.git[rootroom9pc01 ~]# brctl show– virsh net-list [--all]是一样的...

长兴住房和城乡建设局网站/友情链接有哪些作用

方法一&#xff1a;插入断点&#xff0c;Debug运行 在欲查看变量值的语句前&#xff0c;插入断点&#xff0c;Debug运行。之后&#xff0c;就在Debug面板下&#xff0c;可以查看各变量值&#xff0c;然后还可按F8、F7、F9查看、调试代码。也可对某些变量&#xff0c;点击右键&a…...

花的网站建设规划书/百度推广多少钱一天

作者部门&#xff1a;数字地球重点实验室近日&#xff0c;中科院空天信息研究院数字地球重点实验室王超研究员团队首次公开了合成孔径雷达(SAR)图像船舶检测数据集。该数据集来自于多源、多模式SAR图像。基于此数据集&#xff0c;该团队实现了复杂背景下的商船检测与分类一体化…...

怎样建设自己的美甲网站/站长之家工具

package com.bjpowernode.javase.enum2; // 采用枚举的方式改造程序 /* 总结&#xff1a; 1、枚举是一种引用数据类型 2、枚举类型怎么定义&#xff0c;语法是&#xff1f; enum 枚举类型名{ 枚举值1,枚举值2 } 3、结果只有两种情况的…...

手机网站建设技术方案/建网站找哪个平台好呢

1.作业题目&#xff1a; 原生python实现knn分类算法&#xff0c;用鸢尾花数据集 2.算法分析&#xff1a; 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来&#xff0c;当测试对象的属性和某个训练对象的属性完全匹配时&#xff0c;便可以对其进行分类。但是怎么…...