2023-06-26:在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态 给你一个由灯的位置组成的二维数组 lamps 其中 lamps[i] = [rowi,
2023-06-26:在大小为 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 表示未照亮。
输入:n = 5, lamps = [[0,0],[4,4]], queries = [[1,1],[1,0]]。
输出:[1,0]。
答案 2023-06-26:
大体步骤如下:
1.首先,定义一个存储灯位置的二维数组 lamps,和查询位置的二维数组 queries。
2.创建四个 map,用于记录每行、每列、左上到右下对角线和右上到左下对角线上的灯的数量。还有一个 points map,用于存储所有点的状态。
3.遍历灯的位置,将灯的状态记录到相关的 map 中,并将点的状态记录到 points map 中。
4.创建一个结果数组 ans,用于存储每个查询的结果。
5.对于每一个查询位置,初始化结果为 0。
6.如果查询位置所在的行、列、左上到右下对角线或者右上到左下对角线上有灯,将结果设为 1。
7.遍历查询位置周围的 8 个方向,如果有灯,则关闭该灯,并在相关的 map 中减去相应的数量。
8.返回结果数组 ans。
时间复杂度分析:
遍历灯的位置并初始化 maps 需要 O(lamps),其中 lamps 是灯的数量。
对于每个查询位置,遍历周围的 8 个方向,检查是否有灯需要 O(1) 的时间。
因此,总的时间复杂度为 O(lamps + queries)。
空间复杂度分析:
maps 和 points 的空间复杂度均为 O(lamps),其中 lamps 是灯的数量。
结果数组 ans 的空间复杂度为 O(queries),其中 queries 是查询的数量。
因此,总的空间复杂度为 O(lamps + queries)。
go 完整代码如下:
rust 完整代码如下:
c++完整代码如下:
c 完整代码如下:
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/b39fb9a2c3475decb02c7e567】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论