zoukankan      html  css  js  c++  java
  • LeetCode 807. 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.

    在二维数组中grid,每个值grid[i][j]表示位于那里的建筑物的高度。我们被允许以任何数量增加任何数量的建筑物的高度(不同建筑物的数量可以不同)。高度0也被认为是建筑物。 

    最后,从网格的所有四个方向(即顶部,底部,左侧和右侧)观察时的“天际线”必须与原始网格的天际线相同。城市的天际线是从远处观看时由所有建筑物形成的矩形的外部轮廓。请参阅以下示例。

    建筑物高度可以增加的最大总和是多少?

    示例:
    输入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
     输出: 35
     说明:  
    网格为:
    [[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]矩形棱柱。

    解题思路:从这道题的含义看,天际线是每行的最大值和每列的最大值组成,所以对于任意的第grid[i][j]而言,求以grid[i][j]为十字形可取的最大值 即 min(max(row [i],col [j] ))

    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;
        }
    };
  • 相关阅读:
    我们失去了,我们又没有失去什么
    人过 40
    KPI绩效考核为何在国内不管用?
    再也不必当心我的密码了,多个SAP 客户端自动输入密码
    大器晚成
    人际能量相吸定律
    SQL SERVER函数——表值函数的处理
    MS-SQL SERVER单列合并的四种常用方法
    实战 SQL Server 2008 数据库误删除数据的恢复
    唉,怎么一眨眼就老了!
  • 原文地址:https://www.cnblogs.com/baiyunwanglai/p/11483155.html
Copyright © 2011-2022 走看看