LeetCode解析------218.天际线问题-树状数组

2023-10-26

题目:

城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B)。
在这里插入图片描述
在这里插入图片描述

每个建筑物的几何信息用三元组 [Li,Ri,Hi] 表示,其中 Li 和 Ri 分别是第 i 座建筑物左右边缘的 x 坐标,Hi 是其高度。可以保证 0 ≤ Li, Ri ≤ INT_MAX, 0 < Hi ≤ INT_MAX 和 Ri - Li > 0。您可以假设所有建筑物都是在绝对平坦且高度为 0 的表面上的完美矩形。

示例 1:

例如,图A中所有建筑物的尺寸记录为:[ [2 9 10], [3 7 15], [5 12 12], [15 20 10], [19 24 8] ] 。
输出是以 [ [x1,y1], [x2, y2], [x3, y3], … ]格式的“关键点”(图B中的红点)的列表,它们唯一地定义了天际线。关键点是水平线段的左端点。请注意,最右侧建筑物的最后一个关键点仅用于标记天际线的终点,并始终为零高度。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。
例如,图B中的天际线应该表示为:[ [2 10], [3 15], [7 12], [12 0], [15 10], [20 8],[24, 0] ]。

说明:

任何输入列表中的建筑物数量保证在 [0, 10000] 范围内。 输入列表已经按左 x 坐标 Li 进行升序排列。 输出列表必须按 x 位排序。 输出天际线中不得有连续的相同高度的水平线。例如 […[2 3], [4 5], [7 5], [11 5], [12 7]…] 是不正确的答案;三条高度为 5 的线应该在最终输出中合并为一个:[…[2 3], [4 5], [12 7], …]

简单介绍:
题目:天际线问题
题目难度:困难
使用语言:JAVA。
这道题来自leetcode题库的树状数组标签。

解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.记录拐点,保存当前区间最高建筑物的左边坐标。
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,

数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.points:调整顺序后的建筑物坐标,按x坐标从小到大。
-----x相同的情况:------
a.左坐标在右坐标前面
b.同为左坐标,高的在前
c.同为右坐标,高的在后
2.results:保存结果

算法:
既然明确了我们的数据结构,我们就可以开始我们的算法分析了。
1.自定义排序规则,如上面数据结构所描述的
2.自定义一个TreeMap,从大到小排序
3.遍历points,左边坐标出现则相应高度加1,右边坐标出现则相应高度减1。
高度变化,则加入results。

代码部分:

import java.util.*;

public class Solution {
    public List<List<Integer>> getSkyline(int [][]buildings){
        List<List<Integer>> points=new ArrayList<>();//参与运算
        List<List<Integer>> results=new ArrayList<>();//结果
       // int n=buildings.length;
        //查找左上角右上角坐标,左上角坐标保存为负数
        for(int []b:buildings){
            List<Integer> p1=new ArrayList<>();
            p1.add(b[0]);
            p1.add(-b[2]);
            points.add(p1);

            List<Integer> p2=new ArrayList<>();
            p2.add(b[1]);
            p2.add(b[2]);
            points.add(p2);
        }
         //对坐标排序,利用自定义比较规则
        Collections.sort(points, new Comparator<List<Integer>>() {
            @Override
            public int compare(List<Integer> p1, List<Integer> p2) {
                int x1=p1.get(0);
                int y1=p1.get(1);
                int x2=p2.get(0);
                int y2=p2.get(1);
                if(x1!=x2){
                    return x1-x2;//从小到大排序
                } else {
                    return y1-y2;//左坐标从大到小,右坐标从小到大
                }
            }
        });

        TreeMap<Integer,Integer> treeMap=new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;//依次找到最大的
            }
        });
        treeMap.put(0,1);//初始设置最大堆
        int preMax=0;//目前最大高度

        for(List<Integer> p:points){//逐个查找拐点
            int x=p.get(0);
            int y=p.get(1);
            if(y<0){
                Integer v=treeMap.get(-y);//高度调整
                if(v==null){
                    treeMap.put(-y,1);
                } else {
                    treeMap.put(-y,v+1);
                }
            }else {
                Integer v= treeMap.get(y);
                if(v==1){
                    treeMap.remove(y);
                }else{
                    treeMap.put(y,v-1);
                }
            }

            int curMax=treeMap.firstKey();
            if(curMax!=preMax){//高度变化,则添加拐点
                List<Integer> temp=new ArrayList<>();
                temp.add(x);
                temp.add(curMax);
                results.add(temp);
                preMax=curMax;
            }
        }

        return results;


    }
}

在这里插入图片描述

结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode解析------218.天际线问题-树状数组 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 矩阵系列:矩阵乘法

    上一篇说到一个基本的小知识点浮点到定点的转换 这一篇来说说矩阵乘法 矩阵乘法和下一篇要说的矩阵LU分解是矩阵求逆的重要组成部分 所以就算大家不需要做矩阵求逆 对其先有个整体的认识也是好的 矩阵求逆的整体框图还是很好理解的 甚至你只要瞟一眼图
  • PS学习笔记--去掉图片上不想要的部分

    1 首先打开Photoshop 将要修改的图片拖到画布中 2 点击左侧 选框工具 在弹出菜单栏点击 矩形选框 利用选框工具 选择图片上的文字 3 然后右键点击选框 在弹出的菜单栏中 选择 填充 选项 点击打开后 进入填充选项 4 将使用设置
  • Golang - api中生产数据,另一个进程控制并发数去消费api中生产的数据

    api示例 该实例主要功能是实现一个API API在调用的时候会向channel中发送任务数据 Consumer函数去消费channel中的任务数据 并且可以通过maxConcurrency去控制消费的并发数 package main im
  • OS 二级页表

    条件 32位逻辑地址空间 页面大小4KB 页表项大小4B 以字节为编址单位 页面大小为4KB 页内偏移地址为log24K 12位 页号部分为20位 若不采用分级页表 则仅一个页表就要占用20x4B 4KB 1024页 4MB 页表项仅用于存
  • SHH 客户端神器之MobaXterm

    本文着重介绍 MobaXterm 的下载 安装 简单使用 以及其强大的功能亮点 优点 MobaXterm 的下载 如果是个人使用 下载家庭版 免费的 就可以满足基本工作需求 如果想要使用更丰富的功能 可以使用专业版 收费的 个人使用的是家庭
  • 更换新硬盘,重新装回正版win10的方法

    1 添加 Microsoft 帐户并将其链接到数字许可证 这一步可以参考微软给出的官方的解决方法https support microsoft com zh cn help 20530 windows 10 reactivating aft
  • Java中的for循环/增强for/嵌套for(基础一)

    目录 一 Java中的for循环语句 1 普通的for循环 2 for each 增强for循环 3 嵌套for循环 一 Java中的for循环语句 1 普通的for循环 普通的for循环由初始化 布尔表达式条件 初始量自增 自减 循环体组
  • 【内附源码和文档】在线课堂管理平台的设计与实现

    在线课堂管理平台的设计与实现 一 需求分析 1 1 需求来源 通过研究传统的课堂学习特点 了解到传统课堂教学中存在教师与学生沟通不便 通知与作业不能及时传达 教学资源不能高效共享等不足 本项目使用 Java EE 技术来解决上述需求 此项目
  • 重学java笔记「一」

    1 关于程序入口 所有的Java 程序由public static void main String args 方法开始执行 2 java支持的变量类型 2 1类变量 静态变量 独立于方法之外的变量 用 static 修饰 无论一个类创建了
  • jmeter简介

    性能测试 性能测试是什么 就是说基于协议模拟用户的发出请求 对服务器进行一定的负载 来测试服务器的性能指标是否满足要求性能指标关注点 时间性能 空间性能 性能测试与页面无关 性能测试工具 HP LoadRunner Apache AB Ap
  • MMDrawerController 与 StoryBoard 构建和谐抽屉效果

    纠结了一天都不知道怎么在storyboard中用MMDrawerController 看了下MMDrawerController Storyboard版本的库也不知道怎么用 网上搜了下 发现了个好方法 参考 http www wenzizo
  • 2017年、2019年全国大学生电子设计竞赛综合测评——常用电路Multisim仿真——方波、三角波振荡电路

    相关原创博客 2017年综合测评仿真电路讲解 题目和结果链接 常用电路Multisim仿真 方波 三角波振荡电路 常用电路Multisim仿真 有源低通滤波器设计 常用电路Multisim仿真 数字芯片74LS74构建分频器设计 常用电路M
  • Couch的MapReduce查询

    1 MapReduce介绍 传统的关系型数据库中 只要你的数据是结构化的 你可以进行任何类型的查询 Apache Couch与此相反 它使用MapReduce 预定义的map和的reduce方法 进行查询 这种查询方式具有更好的灵活性 因为
  • laravel-admin安装

    前言 Laravel Admin 是一个国产项目 作者是 song Laravel Admin 整合了 AdminLTE 内置了权限管理 还可以快速的创建数据表格和表单 更棒的是它是开源的 所以现在有很多人选择使用它来搭建管理后台 官网是h
  • jeecgboot 基础说明

    参考地址 1 主页面 路径 public index html 解释 配置登录页的title 和登录加载过程出现的文字 2 前端页面整体布局 路径 src components page GlobalLayout vue 解释 页面的菜单
  • Apache+SVN+Review Board代码审核服务器搭建流程

    Apache SVN Review Board代码审核服务器搭建流程 本博文基于原创 四京 https blog 51cto com 12676522 1929856 utm source oschina app 更新修改 一 简介 代码审
  • 【每日一题】ABC194E-Mex Min

    题目内容 原题链接 给定一个长度为 n n n 的整数数组 a a a 求所有长度为 m m
  • 腾讯云服务器带宽计费模式按流量内网、外网出入流量计算说明

    腾讯云服务器公网带宽计费模式按使用流量计费 云服务器对内或对外产生的流量如何计算 云服务器出方向 下行流量 和入方向 上行流量 怎么计算 腾讯云百科来详细说下腾讯云服务器按使用流量计算说明 腾讯云服务器带宽计费模式按使用流量 同一私有网络内
  • for in 和 for of 有什么区别

    for in和for of是两种用于遍历数据结构的循环语句 它们在用法和功能上有一些区别 for in循环 for in循环用于遍历对象的可枚举属性 在循环中 变量代表当前遍历到的属性名 字符串类型 循环会遍历对象的自身属性以及继承的属性
  • LeetCode解析------218.天际线问题-树状数组

    题目 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓 现在 假设您获得了城市风光照片 图A 上显示的所有建筑物的位置和高度 请编写一个程序以输出由这些建筑物形成的天际线 图B 每个建筑物的几何信息用三元组 Li Ri Hi