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

原题如下:

解题代码如下:

 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轴的最大值,需要注意的是由于数组一维长度不一定相等,在求竖直天际线的时候需要判断。

运行结果:

修改条件:

运行结果:

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

原文地址:https://www.cnblogs.com/chengpu/p/algorithm1.html