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

JAVA学习-练习试用Java实现“天际线问题”

问题:

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

每个建筑物的几何信息由数组 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], ...]

示例 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 非递减排序

解答思路:

使用 Java 语言编辑实现天际线问题,以下是提供的代码示例:

import java.util.ArrayList;import java.util.List;import java.util.TreeMap;class Solution {public List<List<Integer>> getSkyline(int[][] buildings) {List<List<Integer>> result = new ArrayList<>();TreeMap<Integer, Integer> map = new TreeMap<>();for (int[] building : buildings) {int left = building[0];int right = building[1];int height = building[2];map.put(left, map.getOrDefault(left, 0) + height);map.put(right, map.getOrDefault(right, 0) - height);}int prevHeight = 0;for (int key : map.keySet()) {int currentHeight = prevHeight + map.get(key);if (currentHeight!= prevHeight) {List<Integer> point = new ArrayList<>();point.add(key);point.add(currentHeight);result.add(point);}prevHeight = currentHeight;}return result;}public static void main(String[] args) {int[][] buildings = {{2, 9, 10}, {3, 7, 15}, {5, 12, 12}, {15, 20, 10}, {19, 24, 8}};Solution solution = new Solution();List<List<Integer>> skyline = solution.getSkyline(buildings);for (List<Integer> point : skyline) {System.out.println(point.get(0) + " " + point.get(1));}}}

该代码的主要思想是使用一个有序的映射('TreeMap')来维护建筑物的左边界和高度的对应关系,以及右边界和高度的对应关系。在遍历建筑物数组时,将左边界的高度增加,右边界的高度减少,并在映射中更新高度值。然后,再遍历映射,构建天际线的关键点列表。如果当前关键点的高度与上一个关键点的高度不同,则将当前关键点添加到列表中。

(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

相关文章:

  • Linux Ubuntu 20.04.06 安装Onboard虚拟键盘教程
  • gitignore
  • JAVA学习笔记-JAVA基础语法-DAY20-字节流、字符流
  • 语音模块——LSYT201B模组(超详细)
  • 实用的网站
  • 昇思25天学习打卡营第9天|MindSpore-Vision Transformer图像分类
  • Qt——升级系列(Level Seven):事件、文件
  • MySQL之应用层优化(三)
  • 基于Android Studio外卖系统,订餐系统
  • 【python】OpenCV—QR Code
  • jenkins部署和使用
  • IT行业入门,如何假期逆袭,实现抢跑
  • 基于redisson实现tomcat集群session共享
  • 几种linux开机自启脚本的方法
  • c语言回顾-数组(全网最详细,哈哈哈)
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Effective Java 笔记(一)
  • es6(二):字符串的扩展
  • go append函数以及写入
  • HashMap剖析之内部结构
  • JavaScript新鲜事·第5期
  • Material Design
  • MD5加密原理解析及OC版原理实现
  • Next.js之基础概念(二)
  • nginx 负载服务器优化
  • Phpstorm怎样批量删除空行?
  • rabbitmq延迟消息示例
  • React as a UI Runtime(五、列表)
  • 测试如何在敏捷团队中工作?
  • 彻底搞懂浏览器Event-loop
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 机器学习中为什么要做归一化normalization
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 详解移动APP与web APP的区别
  • 原生JS动态加载JS、CSS文件及代码脚本
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #NOIP 2014# day.1 T2 联合权值
  • #Ubuntu(修改root信息)
  • #考研#计算机文化知识1(局域网及网络互联)
  • #每日一题合集#牛客JZ23-JZ33
  • (9)STL算法之逆转旋转
  • (python)数据结构---字典
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十一)c52学习之旅-动态数码管
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转载)Google Chrome调试JS
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 项目指定SDK版本