【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])))

 

 参考文章:

【力扣时间】【807】【中等】保持城市天际线_山峰-CSDN博客

python中zip()函数的用法_张康的博客-CSDN博客_python zip

猜你喜欢

转载自blog.csdn.net/qq_62932195/article/details/121903992
今日推荐