题目分析
给定一个二维数组,行列长度相等,要保持四个方向仍一观察高度不变的情况下,适当添加建筑高度,问最大高度增量和。所谓四个方向高度不变的增量,其实就是arr[i][j]与同i行最大值同j列最大值之间的最小值的差,有点绕,举例:grid[0][0]的高度增量=同0行最大值8与同0列最大值9之间的最小值,即8的差为8-3=5。同理推出其他位置的增量求和。
思路分析
用一个行为2列为grid.length的二维数组存储每行每列的最大值,例如第一行最大值存在[0][0],第一列最大值存在[1][0],依此类推。然后重新遍历grid的每个元素进行题目分析所述的操作,计数器+=Math.min(行最大值,列最大值)-grid[i][j]。
代码
class Solution {public int maxIncreaseKeepingSkyline(int[][] grid) {int[][] arr=new int[2][grid.length];//用于存储最大值,第一行都是列最大值,第二行都是行最大值int re=0;//计数器用于返回答案for(int i=0;i<grid.length;i++){//遍历每行int max=-1;//初始化这一行的最大值for(int j=0;j<grid.length;j++){//遍历这一行的每一列值if(max<grid[i][j]){//判断是否更大max=grid[i][j];//更新最大值}}arr[0][i]=max;//每行结束后存储最大值}for(int i=0;i<grid.length;i++){//遍历每列int max=-1;//初始化这一列的最大值for(int j=0;j<grid.length;j++){//遍历这一列的每一行值if(max<grid[j][i]){//判断是否更大max=grid[j][i];//更新最大值}}arr[1][i]=max;//每列结束后存储最大值}for(int i=0;i<grid.length;i++){//遍历每行for(int j=0;j<grid.length;j++){//遍历每个元素re+=Math.min(arr[0][j],arr[1][i])-grid[i][j];
//Math.min(对应行最大值,对应列最大值)-这个元素,得到可以增加的高度}}return re;//返回答案}
}
感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。