北京企業(yè)網(wǎng)站設(shè)計公司win10優(yōu)化大師好用嗎
給你一座由 n x n 個街區(qū)組成的城市,每個街區(qū)都包含一座立方體建筑。給你一個下標(biāo)從 0 開始的 n x n 整數(shù)矩陣 grid ,其中
grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。城市的 天際線 是從遠(yuǎn)處觀察城市時,所有建筑物形成的外部輪廓。從東、南、西、北四個主要方向觀測到的 天際線 可能不同。
我們被允許為 任意數(shù)量的建筑物 的高度增加 任意增量(不同建筑物的增量可能不同) 。 高度為 0
的建筑物的高度也可以增加。然而,增加的建筑物高度 不能影響 從任何主要方向觀察城市得到的 天際線 。在 不改變 從任何主要方向觀測到的城市 天際線 的前提下,返回建筑物可以增加的 最大高度增量總和 。
輸入: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
解釋:增加任何建筑物的高度都會導(dǎo)致天際線的變化。
提示:
n == grid.length
n == grid[r].length
2 <= n <= 50
0 <= grid[r][c] <= 100
解題思路:
1、找到每行每列的最大值,用兩個一維數(shù)組記錄
2、這樣不管從哪個方向看都是它們
3、這樣每個樓房的高度取每行每列最大高度中最小的那個即可
代碼:
class Solution {public int maxIncreaseKeepingSkyline(int[][] grid) {int len = grid.length;int r[] = new int[len];int c[] = new int[len];for(int i = 0; i < len; i ++)for(int j = 0; j < len; j ++) {r[i] = Math.max(grid[i][j], r[i]);c[j] = Math.max(c[j], grid[i][j]);}int res = 0;for(int i = 0; i < len; i ++)for(int j = 0; j < len; j ++) res = res + Math.min(r[i], c[j]) - grid[i][j];return res;}
}