返回
LeetCode 1001. 网格照明,轻松拿捏
前端
2024-01-07 21:42:58
在浩瀚的算法海洋中,LeetCode 1001. 网格照明犹如一座巍峨的高峰,等待着算法爱好者们去攀登。虽然题目被标注为困难,但只要我们深入理解题意,这道题目其实并没有那么难。
破解难题的利器:理解题意
网格照明的问题背景是这样的:有一个 n x n 的网格,每个格子上都放置着一个灯泡。给你一个由灯泡索引组成的数组 lamps,其中每个索引表示一个灯泡的位置。此外,你还需要维护一个由坐标组成的数组 queries,其中每个坐标表示一个操作。操作有两种类型:
- 打开灯泡: 如果你按下一个坐标 (row, col),那么它将打开位于 row 行和 col 列的灯泡。
- 关闭灯泡: 如果你按下一个坐标 (row, col),那么它将关闭位于 row 行和 col 列的灯泡。
你的任务是计算在执行完所有操作后,有多少个灯泡是亮着的。
清晰的思路,巧妙的算法
理解了题意后,我们就可以开始设计算法来解决这个问题。这里提供一种清晰易懂的思路:
- 初始化一个网格: 创建一个 n x n 的网格,并用 0 表示灯泡关闭,1 表示灯泡打开。
- 遍历灯泡索引: 对于 lamps 中的每个索引,在网格中将对应的灯泡位置设置为 1。
- 遍历查询: 对于 queries 中的每个操作,执行以下步骤:
- 如果是打开灯泡操作,则将网格中对应位置的灯泡状态置为 1。
- 如果是关闭灯泡操作,则将网格中对应位置的灯泡状态置为 0。
- 统计亮着的灯泡: 遍历网格,计算所有值为 1 的格子的数量。
示例代码,一览无余
def gridIllumination(n, lamps, queries):
# 初始化网格
grid = [[0] * n for _ in range(n)]
# 记录灯泡索引和受影响的行和列
row_idx = {}
col_idx = {}
diag1_idx = {}
diag2_idx = {}
# 打开灯泡
for lamp in lamps:
r, c = lamp // n, lamp % n
grid[r][c] = 1
row_idx[r] = row_idx.get(r, 0) + 1
col_idx[c] = col_idx.get(c, 0) + 1
diag1_idx[r - c] = diag1_idx.get(r - c, 0) + 1
diag2_idx[r + c] = diag2_idx.get(r + c, 0) + 1
# 处理查询
result = []
for query in queries:
r, c = query[0], query[1]
if grid[r][c]:
result.append(1)
if row_idx.get(r, 0) > 0 or col_idx.get(c, 0) > 0 or diag1_idx.get(r - c, 0) > 0 or diag2_idx.get(r + c, 0) > 0:
# 关闭受影响的灯泡
grid[r][c] = 0
row_idx[r] -= 1
col_idx[c] -= 1
diag1_idx[r - c] -= 1
diag2_idx[r + c] -= 1
return result
结语
通过深入理解题意,巧妙设计算法,LeetCode 1001. 网格照明这道困难题目变得迎刃而解。希望这篇文章能够帮助你轻松征服这道题目,在算法的道路上继续前行。