力扣每日一题:807. 保持城市天际线

news2024/9/21 11:02:36

文章目录

  • ***今日份每日一题:***
    • 题目要求:
    • 示例如下:
      • 示例1
      • 示例2
    • 解释
      • 剖析示例
        • 示例1
        • 示例2
      • 将逻辑思路转换为代码

力扣官网:前往作答!!!!

今日份每日一题:

题目要求:

  • 给你一座由 n x n 个街区组成的城市,每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid,其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的高度 。

  • 城市的 天际线 是从远处观察城市时,所有建筑物形成的外部轮廓。从东、南、西、北四个主要方向观测到的天际线可能不同。

  • 我们被允许为任意数量的建筑物 的高度增加 任意增量(不同建筑物的增量可能不同)。高度为 0 的建筑物的高度也可以增加。然而,增加的建筑物高度不能影响从任何主要方向观察城市得到的天际线 。

  • 在不改变从任何主要方向观测到的城市 天际线 的前提下,返回建筑物可以增加的最大高度增量总和 。

示例如下:

示例1

输入:grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
输出:35
解释:建筑物的高度如上图中心所示。
用红色绘制从不同方向观看得到的天际线。
在不影响天际线的情况下,增加建筑物的高度:
gridNew =
[ [8, 4, 8, 7],
[7, 4, 7, 7],
[9, 4, 8, 7],
[3, 3, 3, 3] ]
在这里插入图片描述

示例2

输入:grid = [[0,0,0],[0,0,0],[0,0,0]]
输出:0
解释:增加任何建筑物的高度都会导致天际线的变化。

解释

剖析示例

示例1

个人觉得第一遍题目看起来还是比较抽象的,那么画个具体的图加深印象:

  • 我将从四个方向观察其天际线
    请添加图片描述
    从第一个角度(北边)看起:
  • 天际线就是最高的那栋楼连起来的线
  • 所以我们不需要管最高楼前面和后面的楼,也就是对于天际线来说无论后面和前面的楼高度怎么变,只要大于他就不会变
  • 对于北边角度来说,我们只要确保(1,2)坐标的9,(2,3)坐标的4,(3,2)坐标的6以及(4,3)坐标的7在它的这一列中保持最大值就可以了
    请添加图片描述
    那么我们来看第二个角度(东边往西边看)的天际线:
  • 我们只要确保(2,1)的3,(3,2)的6,(4,3)的7以及(3,4)的8保持最大值就可以了
    请添加图片描述
    那么我们再来看第三个角度(南边往北边看)的天际线:
  • 我们只要确保(1,2)的9,(2,3)的4,(3,2)的6以及(4,3)的7保持最大值就可以了

请添加图片描述
我们来看最后一个方向:

  • 我们只要确保(3,4)的8,(4,3)的7,(1,2)的9以及(2,1)的3保持最大值就可以了

请添加图片描述

  • 当我把这些要保持的最大值都圈出来后,再来看这张图
  • 我们只需要确保当前值小于所在行,所在列的最大值就能保持天际线不变了

请添加图片描述

  • 这就是变换之后的图
  • 我们的最高楼层可以到达所在行和所在列中最大值,但是不能超过它
  • 比如坐标(1,1),他需要小于等于9,也需要小于等于3,那么我们选择3时,它满足了天际线的情况
  • 虽然他遮住了后面原本天际线的3,但是它变成了现在天际线的3,并没有改变天际线。
  • 那么最后计算的结果就是92(增加楼层后的楼层总数)-57(原先的楼层总数)= 35

请添加图片描述

示例2

输入:grid = [[0,0,0],[0,0,0],[0,0,0]]
输出:0

  • 这个比较简单,就不画图了
  • 它四个方向的天际线都是0,0,0,0
  • 那么它无论增加哪一个楼层都会使它的天际线改变,所以相加后都是0

将逻辑思路转换为代码

逻辑思路:

  • 我们需要去寻找高度的限制,也就是行和列的最大高度
  • 当我们寻找到行和列的最大高度,我们就可以将当前楼层的高度增加
  • 至于如何增加楼层不改变天际线,那就是楼层高度小于等于行和列最大高度,这样就不会改变天际线
  • 其实也就是增加到行和列最大值的最小值
  • 最后再将当前最高楼层高度减去实际楼层高度
  • 最后将这些差值累加起来就是能增加的全部楼层高度

代码:

  • 一个数组/队列存放行最大值
  • 一个数组/队列存放列最大值
  • 第一次循环遍历,找出行和列的最大值,对行和列的最大值进行比较并更换
  • 第二次循环遍历,计算能增加的楼层(行和列的最大值的最小值减去当前楼层)

至于为什么是分别找到行和列的最大值,两者的最小值就是最高能增加到的高度,这个还是需要理解一下的
第二次循环遍历其实可以分成两个步骤,一个步骤是计算出当前能增加到的最高高度,再一个步骤去计算两者差值。这边合并在一起了。
代码中需要注意的是行和列,行是i还是j,列是i还是j

    int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
        int n = grid.size();								//记录行和列,用于初始化行和列队列
        vector<int> rowMax(n);		
        vector<int> colMax(n);
        int ans = 0;
        for(int i=0;i<n;i++){								//双重循环遍历整个grid
            for(int j = 0;j<n;j++){
                rowMax[i] = max(rowMax[i],grid[i][j]);		//比较行,行是外层循环,也就是i,那么就比较rowMax[i]和当前值grid[i][j]
                colMax[j] = max(colMax[j],grid[i][j]);		//比较列,列是内层循环,也就是j,那么就比较colMax[i]和当前值grid[i][j]
            }
        }

        for(int i = 0; i< n;i++){							//再次遍历获取能增加的高度
            for(int j = 0;j<n;j++){
                ans+= min(rowMax[i],colMax[j]) - grid[i][j];//获取行和列最大值的最小值,减去当前楼层就是能增加的楼层,再将它们累加
            }
        }
        return ans;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1927768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法-二叉树常见问题详解

文章目录 1. 二叉树的三种遍历方式的实质2. 二叉树的序列化与反序列化3. 根据前序中序反序列创建二叉树4. 二叉树的路径问题5. LCA公共祖先问题6. 二叉搜索树的LCA问题7. 验证搜索二叉树8. 修建搜索二叉树9. 二叉树打家劫舍问题 1. 二叉树的三种遍历方式的实质 这个相信大家都不…

Python从0到100(四十):Web开发简介-从前端到后端(文末免费送书)

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

王权与自由steam服测试资格申请 王权与自由国际服测试资格申请

不少人都开始期待《王权与自由国际服》的内测&#xff0c;消息已经传出&#xff0c;这款游戏的内测马上会在 太平洋时间4月10日下午1点&#xff0c;也就是世界标准时间的晚上8点&#xff0c;开始封闭式Beta测试&#xff0c;测试时间有为一周&#xff0c;持续到4月17日的太平洋…

万字长文之分库分表里如何设计一个主键生成算法?【后端面试题 | 中间件 | 数据库 | MySQL | 分库分表】

分库分表是在面试里一个非常热门而且偏难的话题&#xff0c;下面了解UUID、自增主键和雪花算法的特点&#xff0c;并且在面试的时候刷出亮点。 前置 所谓的分库分表严格来说是分数据源、分库和分表。例如每个公司订单表的分库分表策略就是用了8个主从集群&#xff0c;每个主从…

Layout View

GoTo 数据网格和视图入门 本文档仅概述特定于LayoutView的功能。有关常用卡和选择功能的信息&#xff0c;请参阅根卡和布局视图一文。 Template Card 布局视图使用布局控件来排列卡片内的内容。对于每个网格列&#xff0c;都会生成一个LayoutViewField对象。切换到数据网格设…

django超市管理系统-计算机毕业设计源码53507

摘 要 随着社会经济的不断发展&#xff0c;超市作为零售行业的一部分&#xff0c;扮演着重要的角色。在信息技术的快速发展的背景下&#xff0c;计算机软件和硬件技术的普及应用在商业管理中起到了至关重要的作用&#xff0c;因此基于Django的超市管理系统应运而生&#xff0c;…

昇思25天学习打卡营第15天|基于MobileNetv2的垃圾分类

一、关于MobileNetv2 MobileNet网络专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;的思想在准确率小幅度降低的前提下&#xff0c;大大减小了模型参数与运算量。并引入宽度系数 α和…

MySQL集群、Redis集群、RabbitMQ集群

一、MySQL集群 1、集群原理 MySQL-MMM 是 Master-Master Replication Manager for MySQL&#xff08;mysql 主主复制管理器&#xff09;的简称。脚本&#xff09;。MMM 基于 MySQL Replication 做的扩展架构&#xff0c;主要用来监控 mysql 主主复制并做失败转移。其原理是将真…

解决vscode项目中无法识别宏定义的问题

在c_cpp_properties.json中的"defines":[]中定义的宏无法被识别。 从而导致代码中的宏开关无法生效&#xff0c;造成代码的阅读不便利。 排查路线是&#xff1a; 关闭所有插件&#xff0c;删除当前工程目录下的.vscode文件夹。 经过一系列排查发现是C/C插件与clangd插…

能把进程和线程讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

数据库基本查询(表的增删查改)

一、增加 1、添加信息 insert 语法 insert into table_name (列名) values (列数据1&#xff0c;列数据2&#xff0c;列数据3...) 若插入时主键或唯一键冲突就无法插入。 但如果我们就是要修改一列信息也可以用insert insert into table_name (列名) values (列数据1&am…

nginx的正向与反向代理

正向代理与反向代理的区别 虽然正向代理和反向代理都涉及代理服务器接收客户端请求并向服务端转发请求&#xff0c;但它们之间存在一些关键的区别&#xff1a; 正向代理&#xff1a; 在正向代理中&#xff0c;代理服务器代表客户端向服务器发送请求&#xff0c;并将服务…

【Linux】安装PHP扩展-igbinary

说明 本文档是在centos7.6的环境下&#xff0c;安装PHP7.4之后&#xff0c;安装对应的PHP扩展igbinary。 一、igbinary简述 igbinary 是一个 PHP 扩展&#xff0c;主要用于序列化和反序列化数据&#xff0c;其设计目的是为了提高序列化过程中的性能和内存效率。 优点&#…

wifi信号处理的CRC8、CRC32

&#x1f9d1;&#x1f3fb;个人简介&#xff1a;具有3年工作经验&#xff0c;擅长通信算法的MATLAB仿真和FPGA实现。代码事宜&#xff0c;私信博主&#xff0c;程序定制、设计指导。 &#x1f680;wifi信号处理的CRC8、CRC32 目录 &#x1f680;1.CRC概述 &#x1f680;1.C…

LeNet入门和Pytorch实现

1. LeNet简介 LeNet是一系列网络的合称&#xff0c;包括LeNet1-LeNet5&#xff0c;是卷积神经网络的开山之作。 文献&#xff1a;LeCun Y, Boser B, Denker J, et al. Handwritten digit recognition with a back-propagation network[J]. Advances in neural information pro…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥是否存在(C/C++)】

查询密钥是否存在(C/C) HUKS提供了接口供应用查询指定密钥是否存在。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 构造对应参数。 指定密钥别名keyAlias&#xff0c;密钥别名最大长度为64字节。查询密钥需要的属性TAG&#…

DZS-12CE/S延时中间继电器 导轨安装 约瑟JOSEF

中间继电器型号&#xff1a; DZS-254 DZS-145 DZS-233 DZS-121 DZS-112 DZS-121 DZS-12BG DZS-12B DZS-213 DZS-234 DZS-11B/Q DZS-226 DZS-652 DZS-17E/302 DZS-12CE/S DZS-821 DZS-226 DZS-249 DZS-254G DZS-12E DZS-895 DZS-234 DZS-655G DZS-651 DZS-115 DZS-…

使用自制Qt工具配合mitmproxy进行网络调试

在软件开发和网络调试过程中&#xff0c;抓包工具是不可或缺的。传统的抓包工具如Fiddler或Charles Proxy通常需要设置系统代理&#xff0c;这会抓到其他应用程序的网络连接&#xff0c;需要设置繁琐的过滤&#xff0c;导致不必要的干扰。为了解决这个问题&#xff0c;我们可以…

一个引发openssl崩溃问题案例

1 背景 最近用libevent写了一个https代理功能&#xff0c;在调研的时候&#xff0c;遇到了一个项目用到了本地多个openssl库引发的ssl握手崩溃问题。 2 开发环境 项目库版本号依赖项libeventlibevent-2.1.8-stableopenssl 1.1openssl1.0u / 1.1.1w / 3.3.1...... 3 问题现象…

FlinkErr:org/apache/hadoop/hive/ql/parse/SemanticException

在flink项目中跑 上面这段代码出现如下这个异常&#xff0c; java.lang.NoClassDefFoundError: org/apache/thrift/TException 加上下面这个依赖后不报错 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId…