原题如下:
解题代码如下:
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轴的最大值,需要注意的是由于数组一维长度不一定相等,在求竖直天际线的时候需要判断。
运行结果:
修改条件:
运行结果:
注意:数组一维和二维都不是固定的,因为一个城市的楼层不可能固定,所以在算法设计阶段应该考虑清楚。