题目:
用一个二维数组,grid来表示城市天际线,二维数组中的每个数代表相应位置上建筑的高度,从横向和纵向观察到最高点,构成城市天际线,集城市天际线有每一列的最大值两个 一维数组构成,问:
在保持城市天际线不变的情况下,所有建筑加起来的总高度最多还能增加多少,每个建筑增加的高度可以不一样,建筑的高度也可以时0
示例 1:
例子:
输入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
输出: 35
解释:
The grid =
[ [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] 的长方体。
解析:
1、首先第一个循环获取每行每列的最大值
2、第二个循环获取每个数在满足条件下的最大值,然后相减获取增加的值
public static int solution(int[][] arr){
int[] lineMax = new int[arr.length];
int[] columnMax = new int[arr[0].length];
int result = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] > lineMax[i]){
lineMax[i] = arr[i][j];
}
if (arr[i][j] > columnMax[j]){
columnMax[j] = arr[i][j];
}
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
result += (columnMax[j] < lineMax[i] ? columnMax[j] : lineMax[i]) - arr[i][j];
}
}
System.out.println(result);
return result;
}