2022.2.8 力扣-每日一题-网格照明
作者:互联网
题目描述:
在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态。
给你一个由灯的位置组成的二维数组 lamps ,其中 lamps[i] = [rowi, coli] 表示 打开 位于 grid[rowi][coli] 的灯。即便同一盏灯可能在 lamps 中多次列出,不会影响这盏灯处于 打开 状态。
当一盏灯处于打开状态,它将会照亮 自身所在单元格 以及同一 行 、同一 列 和两条 对角线 上的 所有其他单元格 。
另给你一个二维数组 queries ,其中 queries[j] = [rowj, colj] 。对于第 j 个查询,如果单元格 [rowj, colj] 是被照亮的,则查询结果为 1 ,否则为 0 。在第 j 次查询之后 [按照查询的顺序] ,关闭 位于单元格 grid[rowj][colj] 上及相邻 8 个方向上(与单元格 grid[rowi][coli] 共享角或边)的任何灯。
返回一个整数数组 ans 作为答案, ans[j] 应等于第 j 次查询 queries[j] 的结果,1 表示照亮,0 表示未照亮。
样例:
方法一:
class Solution {
public:
//方向数组,包含自己在内的9宫格
int dir[9][2] = {{0, 0}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}};
vector<int> gridIllumination(int n, vector<vector<int>>& lamps, vector<vector<int>>& queries) {
//写出网格中各个点的坐标可以发现:
//从左至右的斜线上,各个点的x值和y值之差是恒定的
//从右至左的斜线上,各个点的x值和y值之差的恒定的
//因此可以用哈希表来记录某一条斜线
unordered_map<int, int> mapsx, mapsy, mapsz, mapsk; //分别记录某一横线、竖线、从左至右的斜线、从右至左的斜线上是否被照亮
set<vector<int>> open;
for (vector<int>& lam : lamps)
{
if (!open.count(lam))
{
mapsx[lam[0]]++;
mapsy[lam[1]]++;
mapsz[lam[0] - lam[1]]++;
mapsk[lam[0] + lam[1]]++;
open.insert(lam);
}
}
vector<int> ans;
for (vector<int>& que : queries)
{
int x = que[0];
int y = que[1];
//只要有一个哈希表大于0,就说明这个位置是照亮的
if (mapsx[x] > 0 || mapsy[y] > 0 || mapsz[x - y] > 0 || mapsk[x + y] > 0)
{
ans.push_back(1);
for (int i = 0; i < 9; i++)
{
int newx = x + dir[i][0];
int newy = y + dir[i][1];
if (0 <= newx && newx < n && 0 <= newy && newy < n && open.count({newx, newy}))
{
open.erase({newx, newy});
mapsx[newx]--;
mapsy[newy]--;
mapsz[newx - newy]--;
mapsk[newx + newy]--;
}
}
}
else
{
ans.push_back(0);
}
}
return ans;
}
};
看到困难还是有点害怕的,但是看完题目想了想后发现其实并不难,只需用哈希表记录每条横线、竖线、斜线被多少个灯泡照亮即可,斜线可分为从左至右的斜线(x - y的值恒定),从右至左的斜线(x + y的值恒定)。
标签:lam,int,斜线,单元格,力扣,vector,照亮,一题,2022.2 来源: https://blog.csdn.net/weixin_52629904/article/details/122825586