仅以此纪录每日LootCode所刷题目
题目描述:
示例:
思路:
这个题如果读懂了,思路还是比较简单的,话不多说直接上图:
当时做题是中文版的,没有这张图想了好久。做完之后才发现英文版里有图...其实这个就是从四周看我们只能看到每行每列最高的建筑物,我们可以随意增加建筑物的高度,只要不改变我们所能看到的最高的高度即可。
在代码中,我首先将行和列的最高高度放在了两个数组里,之后合并在一起,从这些最高高度中的最低高度开始(有点绕口,但确是如此,如果不从他们中的最低高度开始,就与改变天际线),将最低高度所对应的行或者列的高度补齐,之后将这一行或者列的高度设为101,这样之后补齐别的行或者列的时候就不会涉及到已经补齐过的位置。补齐的高度差值使用count记录下来。
代码:
class Solution:
def maxIncreaseKeepingSkyline(self, grid: List[List[int]]) -> int:
count = 0
max_col = []
max_row = []
for i in range(len(grid)):
max_row.append(max(grid[i]))
for i in range(len(grid)):
col = []
for j in range(len(grid[0])):
col.append(grid[j][i])
max_col.append(max(col))
max_all = sorted(max_row + max_col)
for i in range(len(max_all)):
if max_all[i] in max_row:
a = max_row.index(max_all[i])
for j in range(len(grid[0])):
if grid[a][j] != 101:
count += (max_all[i] - grid[a][j])
grid[a][j] = 101
max_row[a] = 101
else:
b = max_col.index(max_all[i])
for k in range(len(grid)):
if grid[k][b] != 101:
count += (max_all[i] - grid[k][b])
grid[k][b] = 101
max_col[b] = 101
return count