LeetCode-Max Increase to Keep City Skyline

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24133491/article/details/82751590

Description:
In a 2 dimensional array grid, each value grid[i][j] represents the height of a building located there. We are allowed to increase the height of any number of buildings, by any amount (the amounts can be different for different buildings). Height 0 is considered to be a building as well.

At the end, the “skyline” when viewed from all four directions of the grid, i.e. top, bottom, left, and right, must be the same as the skyline of the original grid. A city’s skyline is the outer contour of the rectangles formed by all the buildings when viewed from a distance. See the following example.

What is the maximum total sum that the height of the buildings can be increased?

Example:

Input: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
Output: 35
Explanation: 
The grid is:
[ [3, 0, 8, 4], 
  [2, 4, 5, 7],
  [9, 2, 6, 3],
  [0, 3, 1, 0] ]

The skyline viewed from top or bottom is: [9, 4, 8, 7]
The skyline viewed from left or right is: [8, 7, 9, 3]

The grid after increasing the height of buildings without affecting skylines is:

gridNew = [ [8, 4, 8, 7],
            [7, 4, 7, 7],
            [9, 4, 8, 7],
            [3, 3, 3, 3] ]

Notes:

  • 1 < grid.length = grid[0].length <= 50.
  • All heights grid[i][j] are in the range [0, 100].
  • All buildings in grid[i][j] occupy the entire grid cell: that is, they are a 1 x 1 x grid[i][j] rectangular prism.

题意:给定一个二维数组,里面的数组表示大楼的高度;可以从四个方向观察这些大楼,得到每个方向上的楼层的最大值;现要求计算在现有楼层的基础上给楼层增加高度使其每个方向上的最大值仍然保持不变;返回最大可增加的楼层高度;

解法:在增加楼层高度之后要保持每个方向上的楼成高度最大值不变,我们只要使其增加后高度为Math.min(这一行上的大楼最大高度,这一列上的大楼最大高度);

Java
class Solution {
    public int maxIncreaseKeepingSkyline(int[][] grid) {
        int totalIncrease = 0;
        int[] rowMax = new int[grid.length];
        int[] colMax = new int[grid[0].length];
        //求每一行的最大值
        for (int i = 0; i < grid.length; i++) {
            int max = -1;
            for (int height : grid[i]) {
                max = Math.max(max, height);
            }
            rowMax[i] = max;
        }
        //求每一列的最大值
        for (int i = 0; i < grid[0].length; i++) {
            int max = -1;
            for (int j = 0; j < grid.length; j++) {
                max = Math.max(max, grid[j][i]);
            }
            colMax[i] = max;
        }
        //求最大可增长
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                totalIncrease += (Math.min(rowMax[i], colMax[j]) - grid[i][j]);
            }
        }  
        return totalIncrease;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_24133491/article/details/82751590