zoukankan      html  css  js  c++  java
  • 垂直、水平方向观看楼层天际线不变情况下能增加的建筑物高度最大总和

    原题如下:

    解题代码如下:

     1 public class test {
     2     public static void main(String[] args) {
     3         int [][] grid = {{3,0,8,4},{2,4,5,7},{9,2,6,3},{0,3,1,0}};
     4         int maxY = 0;
     5         int maxX = 0;
     6         int count = 0;
     7         for(int i=0;i<grid.length;i++) {
     8             if(maxX<grid[i].length) {
     9                 maxX = grid[i].length;
    10             }
    11         }
    12         maxY = grid.length;
    13         int y[] = new int [maxX];//竖直方向
    14         int x[] = new int [maxY];//水平方向
    15         //求出竖直方向天际线
    16         for(int i=0;i<maxX;i++) {
    17             int max = 0;
    18             for(int j=0;j<maxY;j++) {
    19                 if(grid[j].length>i) {
    20                     if(grid[j][i]>max) {
    21                         max = grid[j][i];
    22                     }
    23                 }
    24             }
    25             y[i] = max;
    26         }
    27         //求出水平方向天际线
    28         for(int i=0;i<maxY;i++) {
    29             int max = 0;
    30             for(int j=0;j<grid[i].length;j++) {
    31                 if(grid[i][j]>max) {
    32                     max = grid[i][j];
    33                 }
    34             }
    35             x[i]=max;
    36         }
    37         //求出增加层数总和及改变后的楼层数组
    38         for(int i=0;i<maxY;i++) {
    39             for(int j=0;j<grid[i].length;j++) {
    40                 count += (x[i]<y[j]?x[i]:y[j])-grid[i][j];
    41                 grid[i][j] = x[i]<y[j]?x[i]:y[j];
    42             }
    43         }
    44         //输出
    45         System.out.println(count);
    46         System.out.print("从数组垂直方向看天际线是:");
    47         for(int i=0;i<maxX;i++) {
    48             System.out.print(y[i]+" ");
    49         }
    50         System.out.println();
    51         System.out.print("从数组水平方向看天际线是:");
    52         for(int i=0;i<maxY;i++) {
    53             System.out.print(x[i]+" ");
    54         }
    55         System.out.println("
    gridNew=");
    56         for(int i=0;i<maxY;i++) {
    57             for(int j=0;j<grid[i].length;j++) {
    58                 System.out.print(grid[i][j]+" ");
    59             }
    60             System.out.println();
    61         }
    62     }
    63 }

    算法解析:

    maxX为二维数组x轴最大长度,因为二维数组中每个一维长度可以不等,而竖直方向天际线的个数需要取x轴最大值个数;maxY 为y轴长度,水平方向天际线个数为y轴长度。

    y存储竖直方向天际线,x存储水平方向天际线,count存储可以增加的建筑物高度总和。

    竖直天际线就是二维数组每条y轴中的最大值,水平天际线就是每条x轴的最大值,需要注意的是由于数组一维长度不一定相等,在求竖直天际线的时候需要判断。

    运行结果:

    修改条件:

    运行结果:

    注意:数组一维和二维都不是固定的,因为一个城市的楼层不可能固定,所以在算法设计阶段应该考虑清楚。

  • 相关阅读:
    前序中序输出后序
    Blah数集
    中缀表达式转后缀表达式 (栈)
    1357:车厢调度 (栈)
    最长公共上升子序列 (LIS+LCS+记录)
    1481:Maximum sum (前缀和+dp)
    8464:股票买卖
    7627:鸡蛋的硬度
    2989:糖果
    U33405 纽约 (二分)
  • 原文地址:https://www.cnblogs.com/chengpu/p/algorithm1.html
Copyright © 2011-2022 走看看