通过万岁!!!
- 题目:给你一个二维数组,分别表示每个城市(i,j)的高度,然后要求每个城市现在可以增加自己的高度,但是最大的高度不能超过本行或者本列的原来最大值。返回的是城市可以增加的高度和。
- 思路:先找到行和列的最大值,然后i,j位置增加的高度要小于行和列的最小值即可。
- 技巧:这里就是需要两个一维数组记录行和列的高度。
伪代码
定义行数组row和列数组col
双层for遍历城市数组
如果当前城市高度大于行中已知结果,那就替换
如果当前城市高度大于列中已知结果,那就替换
定义需要返回的高度ans
双层for遍历城市数组
ans加上本城市节点可以提升的高度(也就是row和col两个里面的最小值-当前高度)
return ans;
java代码
class Solution {
public int maxIncreaseKeepingSkyline(int[][] grid) {
int rowMax[] = new int[grid.length];
int colMax[] = new int[grid[0].length];
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
rowMax[i] = rowMax[i] > grid[i][j] ? rowMax[i] : grid[i][j];
colMax[j] = colMax[j] > grid[i][j] ? colMax[j] : grid[i][j];
}
}
int ans = 0;
for (int i = 0; i < grid.length; i++)
for (int j = 0; j < grid[0].length; j++)
ans += ((rowMax[i] < colMax[j] ? rowMax[i] : colMax[j]) - grid[i][j]);
return ans;
}
}
- 总结:难度不大,但是需要两次for,并且需要进行内容的记录,然后明确为什么取最大值(要找到本城市能达到的最大值)和为什么又取最小值(行和列都不能超过之前的高度)。这个题应该是也能只用一个双层for,但是应该是里面需要反复计算,或则用记录一些东西,比较麻烦,这里就先这样吧,通过万岁,不管是找工作,还是打比赛,先通过,再优化。