算法(笔试题) : 城市天际线

题目:

用一个二维数组,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;
    }

猜你喜欢

转载自blog.csdn.net/kai3123919064/article/details/88652927