题目链接
https://leetcode.cn/problems/max-increase-to-keep-city-skyline/
解题思路
找到每一行的最大值,每一列的最大值,然后相应位置上取出较小的那一个
【举例】
在这张图中,第一行的最大值是8,第一列的最大值是9,那么,第一行第一列这个位置可以增加的高度是8-3=5,最大增加5,不会影响从任何方向观察城市得到的天际线
我的通过代码
class Solution {
public:
int maxIncreaseKeepingSkyline(vector<vector<int>> &grid) {
int row = grid.size();
vector<int> row_max;
for (int i = 0; i < row; ++i) {
int temp = grid[i][0];
for (int j = 1; j < row; ++j) {
if (temp < grid[i][j]) {
temp = grid[i][j];
}
}
row_max.push_back(temp);
}
vector<int> col_max;
for (int i = 0; i < row; ++i) {
int temp = grid[0][i];
for (int j = 1; j < row; ++j) {
if (temp < grid[j][i]) {
temp = grid[j][i];
}
}
col_max.push_back(temp);
}
int res = 0;
for (int i = 0; i < row; ++i) {
for (int j = 0; j < row; ++j) {
int max_height = min(row_max[i], col_max[j]);
if (max_height > grid[i][j])
{
res += (max_height - grid[i][j]);
}
}
}
return res;
}
};
官方代码(更简洁)
class Solution {
public:
int maxIncreaseKeepingSkyline(vector<vector<int>> &grid) {
int n = grid.size();
vector<int> rowMax(n);
vector<int> colMax(n);
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
rowMax[i] = max(rowMax[i], grid[i][j]);
colMax[j] = max(colMax[j], grid[i][j]);
}
}
int res = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
res += (min(rowMax[i], colMax[j]) - grid[i][j]);
}
}
return res;
}
};