1. 程式人生 > >LeetCode-Max Increase to Keep City Skyline

LeetCode-Max Increase to Keep City Skyline

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;
    }
}