Leetcode __807. 保持城市天際線
阿新 • • 發佈:2018-12-16
問題描述
在二維陣列grid中,grid[i][j]代表位於某處的建築物的高度。 我們被允許增加任何數量(不同建築物的數量可能不同)的建築物的高度。 高度 0 也被認為是建築物。
最後,從新陣列的所有四個方向(即頂部,底部,左側和右側)觀看的“天際線”必須與原始陣列的天際線相同。 城市的天際線是從遠處觀看時,由所有建築物形成的矩形的外部輪廓。 請看下面的例子。
建築物高度可以增加的最大總和是多少?
例子: 輸入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]] 輸出: 35 解釋: The grid is: [ [3, 0, 8, 4], [2, 4, 5, 7], [9, 2, 6, 3], [0, 3, 1, 0] ]
從陣列豎直方向(即頂部,底部)看“天際線”是:[9, 4, 8, 7] 從水平水平方向(即左側,右側)看“天際線”是:[8, 7, 9, 3]
在不影響天際線的情況下對建築物進行增高後,新陣列如下:
gridNew = [ [8, 4, 8, 7], [7, 4, 7, 7], [9, 4, 8, 7], [3, 3, 3, 3] ] 說明:
- 1 < grid.length = grid[0].length <= 50。
- grid[i][j] 的高度範圍是: [0, 100]。
- 一座建築物佔據一個grid[i][j]:換言之,它們是 1 x 1 x grid[i][j] 的長方體
解題思路
- 首先要找出行最大的陣列
- 再找出列最大的陣列
- 以行最大陣列為行,以列最大陣列為列,對應位置上的值不能超過行跟列的最小值
9 | 4 | 8 | 7 |
---|---|---|---|
8 | 最大值為對應行列的最小值,8 | 行列最小值4 | |
7 | |||
9 | |||
3 |
實現
class Solution { public int maxIncreaseKeepingSkyline(int[][] grid) { if(grid.length==0||grid==null){ return 0; } int row = grid.length; int rank =grid[0].length; int sum=0; for(int i =0;i<row;i++){ for(int j=0;j<rank;j++){ int rankmax=0; int rowmax=0; for(int i1=0;i1<row;i1++){ if(grid[i1][j]>rankmax){rankmax=grid[i1][j];} } for(int j1=0;j1<rank;j1++){ if(grid[i][j1]>rowmax){rowmax=grid[i][j1];} } if(grid[i][j]<Math.min(rankmax,rowmax)){ sum += Math.min(rankmax,rowmax)-grid[i][j]; } } } return sum; } }
時間複雜度較高:0(n3)
實現2
查看了下別人執行時間較短的實現
class Solution {
public int maxIncreaseKeepingSkyline(int[][] grid) {
int[] row = new int[grid.length];
int[] col = new int[grid[0].length];
for(int i=0; i<row.length; i++){
for(int j=0; j<grid[i].length; j++){
if(j==0 || row[i] < grid[i][j]){
row[i] = grid[i][j];
}
if(i==0 || col[j]<grid[i][j]){
col[j] = grid[i][j];
}
}
}
int increase = 0;
for(int i=0; i<grid.length; i++){
for(int j=0; j<grid[i].length; j++){
int min = row[i];
if(min > col[j]) min = col[j];
increase += (min - grid[i][j]);
}
}
return increase;
}
}
時間複雜度:O(n2) 可以看出思路是一致的,但這種是先求出行列最大值組合陣列,再比較求和。