[LeetCode] Max Increase to Keep City Skyline 保持城市天際線的最大增高


 

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.

 

這道題給了我們一個二維數組,說是數組中的每個數字代表了一棟建築的高度,那么從四個方向看去,就會有城市的天際線,這個天際線就是由這些建築的最高的邊形成的,現在讓我們在不改變天際線的前提下,問最多可以增高建築的總高度。那么既然不能改變天際線,我們就要清楚天際線是由啥組成的,是最高的建築物,那么就是說每行或每列的最高那個建築不能變,而其他建築物在不超過該行該列中最高建築的高度情況下是可以有升高空間的。那么思路就該很清晰了,我們首先需要求出各行各列的最大值,成為一個限制高度,然后就遍歷每個建築,每一個建築的高度都有可能影響該行或者該列的天際線,那么該行該列中的較小值應該是該建築物的高度極限,如果超過了這個值,那么原來的天際線就會被破壞,所以這個極限值和當前的高度之差就是可以增加的高度,我們累計所有建築的可增加的高度,就是所求的最大增高,參見代碼如下:

 

class Solution {
public:
    int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size(), res = 0;
        vector<int> row(m, 0), col(n, 0);
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                row[i] = max(row[i], grid[i][j]);
                col[j] = max(col[j], grid[i][j]);
            }
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                res += min(row[i] - grid[i][j], col[j] - grid[i][j]);
            }
        }
        return res;
    }
};

 

參考資料:

https://leetcode.com/problems/max-increase-to-keep-city-skyline/solution/

https://leetcode.com/problems/max-increase-to-keep-city-skyline/discuss/120681/Easy-and-Concise-Solution-C++JavaPython

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM