ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022.2.8 力扣-每日一题-网格照明

2022-02-08 16:00:41  阅读:189  来源: 互联网

标签:lam int 斜线 单元格 力扣 vector 照亮 一题 2022.2


题目描述:

在大小为 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有