题目名字挺酷,颇有一种未来感。
链接如下:
力扣https://leetcode-cn.com/problems/max-increase-to-keep-city-skyline/废话不多说,直接记录思路:
1. 前提grid的'宽'和'高'一定在2到50内,且两者相等,所以问题简单很多,且不用考虑一些极端情况。
2. 遍历grid找出竖直方向和水平方向上的天际线
3. 遍历grid每个元素与元素所处行列的天际线较小者比较,其差之和即为结果
代码如下:
package cn.daycode.leetcode;
public class MaxIncreaseKeepingSkyline {
public static void main(String[] args) {
int[][] gird = {{3,0,8,4},{2,4,5,7},{9,2,6,3},{0,3,1,0}};
System.out.println(maxIncreaseKeepingSkyline(gird));
}
public static int maxIncreaseKeepingSkyline(int[][] grid) {
int[][] skyLine = findSkyline(grid);
int sum = 0;
// 遍历grid,每个元素与对应的skyLine天际线比较差值并求和
for(int i=0; i<grid.length; i++){
for (int j=0; j<grid.length; j++){
int top = skyLine[0][j]>skyLine[1][i]?skyLine[1][i]:skyLine[0][j];
sum = sum + top - grid[i][j];
}
}
return sum;
}
// 该函数找到grid的天际线并以二维数组形式返回。
public static int[][] findSkyline(int [][] grid){
int[][] skyLine = new int[2][grid.length];
// 找天际线,存放到skyLine
for(int i=0; i< grid.length; i++){
int tempVMax = grid[0][i]; // 用于临时存放竖直方向最大值
int tempHMax = grid[i][0]; // 用于临时存放水平方向最大值
for(int j=0; j < grid.length; j++){
if(grid[j][i] > tempVMax){
tempVMax = grid[j][i];
}
if(grid[i][j] > tempHMax){
tempHMax = grid[i][j];
}
}
skyLine[0][i] = tempVMax; // 竖直方向天际线
skyLine[1][i] = tempHMax; // 水平方向天际线
}
return skyLine;
}
}
一共遍历两次grid,不知可否减少循环次数。感觉题目再简化设定后,可以作为编程学习期间的循环嵌套思考题~