218. 天际线问题
时间:2021-07-13
本文章向大家介绍218. 天际线问题,主要包括218. 天际线问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目来源:218. 天际线问题
城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回由这些建筑物形成的 天际线 。
每个建筑物的几何信息由数组 buildings
表示,其中三元组 buildings[i] = [lefti, righti, heighti]
表示:
lefti
是第i
座建筑物左边缘的x
坐标。righti
是第i
座建筑物右边缘的x
坐标。heighti
是第i
座建筑物的高度。
天际线 应该表示为由 “关键点” 组成的列表,格式 [[x1,y1],[x2,y2],...]
,并按 x 坐标 进行 排序 。关键点是水平线段的左端点。列表中最后一个点是最右侧建筑物的终点,y
坐标始终为 0
,仅用于标记天际线的终点。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。
注意:输出天际线中不得有连续的相同高度的水平线。例如 [...[2 3], [4 5], [7 5], [11 5], [12 7]...]
是不正确的答案;三条高度为 5 的线应该在最终输出中合并为一个:[...[2 3], [4 5], [12 7], ...]
解题思路参考:https://briangordon.github.io/2014/08/the-skyline-problem.html
/** * @param {number[][]} buildings * @return {number[][]} */ var getSkyline = function(buildings) { let heights = []; for(let build of buildings){ heights.push([build[0], -build[2]]); heights.push([build[1], build[2]]); } heights.sort((a, b) => (a[0] == b[0])?a[1] - b[1]:(a[0] - b[0]) ); let pre = cur = 0; let res = []; let skylines = new Map(); for(let height of heights){ if(height[1] < 0){ skylines.set(-height[1], (skylines.get(-height[1])||0)+1); }else{ skylines.set(height[1], (skylines.get(height[1])||0)-1); if(skylines.get(height[1]) == 0){ skylines.delete(height[1]); } } cur = skylines.size?Math.max(...Array.from(skylines.keys())):0; if(pre !== cur){ res.push([height[0], cur]); pre = cur; } } return res; };
示例 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
非递减排序
原文地址:https://www.cnblogs.com/yanjianjiang/p/15006055.html
- 移动端H5知识[系列] - “百变”盒模型
- 移动端H5知识[系列] - fixed定位模式与其他
- Hadoop Avro支持多输入AvroMultipleInputs
- 如何让旧浏览器支持HTML5新标签
- PHP对数据库的相关操作
- Java LinqCollection 仿Linq的list常用函数
- json转成java对象
- CSS 1.0~3.0选择器(上)
- 使用贝叶斯做英文拼写检查(c#)
- 贝叶斯文本分类c#版
- weex里Vuex state使用storage持久化
- 网络字体@font-face 如何处理网页中的特殊字体
- python实现多变量线性回归(Linear Regression with Multiple Variables)
- 【美团技术团队博客】序列化和反序列化
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端er来学习一下webWorker吧
- 网页全屏模式轻松掌握[局部元素全屏展示]
- 终于有人把 Spring 循环依赖讲清楚了!
- Java程序员必须搞懂的 Linux 知识大全!
- Java 8 有多牛逼?打破一切你对接口的认知!
- 写了个牛逼的日志切面,甩锅更方便了!
- iOS开发之CryptoKit
- koroFileHeader更新日志
- 掌握浏览器重绘(reflow)重排(repaint)-前端进阶
- var和let/const的区别
- 刷新/关闭页面之前发送请求
- Web Beacon 刷新/关闭页面之前发送请求
- 解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
- python3 logging日志封装实例
- 解决Python中报错TypeError: must be str, not bytes问题