LeetCode每日一题——保持城市天际线
Posted heart_6662
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode每日一题——保持城市天际线相关的知识,希望对你有一定的参考价值。
目录
题目
哈哈是不是看懵了啊,俗话说的好:不会写的题目,好好读多几次题目
读不懂,没关系,我和大家一起读题目
一起来读题目
1)方向问题
所要求的四个方向,实际上两个就够了
因为由于是看平面,
从前看与从后看,
从左看与从右看是完全一样的
2)什么是大楼的高度?
其实就是数组中的值,1代表1层高,2代表2层高
3)如何变化建筑的高度,才能保持天际线不变呢?
就是变化后的高度不超过该点所在的边或列上的最高点
(简单来说就是数值不超过所在行和所在列上的最高值的最小值)
主要思路:
1)先找到所有的行和列的最高的数值(就是所有的行和列的最高的层数)
2)每个元素(每栋楼)的行和列的最高的数值
取最小的(因为最小的限制着)
我们记行和列的最高的数值的 最小值为M
将M减去该位置元素(该栋楼的高度)的差值
加上该位置元素
得到结果 最高可到多少层
代码实现
写法一:
class Solution:
def maxIncreaseKeepingSkyline(self, grid: List[List[int]]) -> int:
row = [max(i) for i in grid] #行的最大
column = [max([item[i] for item in grid]) for i in range(len(grid[0]))] #列的最大
ans = 0
for i in range(len(grid)):
for j in range(len(grid[i])):
ans += (min(row[i],column[j]) - grid[i][j])
return ans
代码解读
1)找到所有的行和列的最高的数值
row = [max(i) for i in grid] #行的最大
column = [max([item[i] for item in grid]) for i in range(len(grid[0]))] #列的最大
结果:
2)for i in range(len(grid)):
for j in range(len(grid[i])):遍历数值
for i in range(len(grid)): #遍历行
for j in range(len(grid[i])): #遍历列
写法二:列表推导式写法
代码解析一样的,除了zip内置函数
class Solution:
def maxIncreaseKeepingSkyline(self, grid: List[List[int]]) -> int:
rowsMax, colsMax = [max(g) for g in grid], [max(z) for z in zip(*grid)]
return sum(min(rowsMax[i], colsMax[j]) - grid[i][j] for i in range(len(grid)) for j in range(len(grid[0])))
参考文章:
以上是关于LeetCode每日一题——保持城市天际线的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 807. 保持城市天际线 / 630. 课程表 III(贪心+优先队列)/ 851. 喧闹和富有(拓扑排序)
LeetCode 541. 反转字符串 II / 701. 二叉搜索树中的插入操作 / 807. 保持城市天际线
解题报告Leecode 807. 保持城市天际线——Leecode每日刷题系列
解题报告Leecode 807. 保持城市天际线——Leecode每日刷题系列