2022.11.9打卡
题目
在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1。mines[i] = [xi, yi]表示 grid[xi][yi] == 0
返回 grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0 。
一个 k 阶由 1 组成的 “轴对称”加号标志 具有中心网格 grid[r][c] == 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1,由 1 组成的臂。注意,只有加号标志的所有网格要求为 1 ,别的网格可能为 0 也可能为 1 。
示例 1:
输入: n = 5, mines = [[4, 2]]
输出: 2
解释: 在上面的网格中,最大加号标志的阶只能是2。一个标志已在图中标出。
别人的代码
class Solution {
public:
int orderOfLargestPlusSign(int n, vector<vector<int>>& mines) {
vector<vector<int>> grid(n, vector<int>(n, 1));
for (auto mine : mines) {
int x = mine[0], y = mine[1];
grid[x][y] = 0;
}
vector<vector<int>> up(n, vector<int>(n, 0));
vector<vector<int>> down(n, vector<int>(n, 0));
vector<vector<int>> left(n, vector<int>(n, 0));
vector<vector<int>> right(n, vector<int>(n, 0));
int cnt = 0;
for (int i = 0; i < n; i++) {
// left
cnt = 0;
for (int j = 0; j < n; j++) {
cnt = grid[i][j] == 0 ? 0 : cnt + 1;
left[i][j] = cnt;
}
// right
cnt = 0;
for (int j = n - 1; j >= 0; j--) {
cnt = grid[i][j] == 0 ? 0 : cnt + 1;
right[i][j] = cnt;
}
}
for (int j = 0; j < n; j++) {
// up
cnt = 0;
for (int i = 0; i < n; i++) {
cnt = grid[i][j] == 0 ? 0 : cnt + 1;
up[i][j] = cnt;
}
// down
cnt = 0;
for (int i = n - 1; i >= 0; i--) {
cnt = grid[i][j] == 0 ? 0 : cnt + 1;
down[i][j] = cnt;
}
}
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int cnt = min({up[i][j], down[i][j], left[i][j], right[i][j]});
res = max(res, cnt);
}
}
return res;
}
};
感想
今天真是倒霉的一天