返回

LeetCode 1001. 网格照明,轻松拿捏

前端

在浩瀚的算法海洋中,LeetCode 1001. 网格照明犹如一座巍峨的高峰,等待着算法爱好者们去攀登。虽然题目被标注为困难,但只要我们深入理解题意,这道题目其实并没有那么难。

破解难题的利器:理解题意

网格照明的问题背景是这样的:有一个 n x n 的网格,每个格子上都放置着一个灯泡。给你一个由灯泡索引组成的数组 lamps,其中每个索引表示一个灯泡的位置。此外,你还需要维护一个由坐标组成的数组 queries,其中每个坐标表示一个操作。操作有两种类型:

  1. 打开灯泡: 如果你按下一个坐标 (row, col),那么它将打开位于 row 行和 col 列的灯泡。
  2. 关闭灯泡: 如果你按下一个坐标 (row, col),那么它将关闭位于 row 行和 col 列的灯泡。

你的任务是计算在执行完所有操作后,有多少个灯泡是亮着的。

清晰的思路,巧妙的算法

理解了题意后,我们就可以开始设计算法来解决这个问题。这里提供一种清晰易懂的思路:

  1. 初始化一个网格: 创建一个 n x n 的网格,并用 0 表示灯泡关闭,1 表示灯泡打开。
  2. 遍历灯泡索引: 对于 lamps 中的每个索引,在网格中将对应的灯泡位置设置为 1。
  3. 遍历查询: 对于 queries 中的每个操作,执行以下步骤:
    • 如果是打开灯泡操作,则将网格中对应位置的灯泡状态置为 1。
    • 如果是关闭灯泡操作,则将网格中对应位置的灯泡状态置为 0。
  4. 统计亮着的灯泡: 遍历网格,计算所有值为 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. 网格照明这道困难题目变得迎刃而解。希望这篇文章能够帮助你轻松征服这道题目,在算法的道路上继续前行。