返回

用LeetCode算法01矩阵,让你的编码之旅更轻松

前端

作为一名满怀热情的程序员,你有没有过这样的经历:当你在解决LeetCode算法问题时,卡在一个“01矩阵”中,感觉就像陷入了一个迷宫?别担心,这篇文章将成为你的指路明灯,为你揭开01矩阵的奥秘。

对于那些初学者来说,01矩阵是一个包含0和1的网格。我们的目标是找到每个单元格到最近的1的距离。

01矩阵的魅力

01矩阵看似简单,但它的本质却十分巧妙。它不仅考验你的算法思维,更能激发你的创造力。通过解决01矩阵问题,你将掌握动态规划的精髓,为日后的算法之路奠定坚实的基础。

算法详解

为了攻克01矩阵,我们将使用动态规划的思想。动态规划是一种将复杂问题分解成一系列子问题的分治法。

我们将网格中的每个单元格看作一个子问题,目标是找到到最近1的最小距离。从左上角开始,我们逐步遍历网格,并根据以下规则更新每个单元格的值:

  • 如果当前单元格是1,则到最近1的距离为0。
  • 如果当前单元格是0,则到最近1的距离等于其上方、左边或右边的最小距离加1。

实现细节

有了算法思路,我们就可以着手用代码实现了。以下是用Python实现的01矩阵算法:

def update_distance(grid, i, j):
  if grid[i][j] == 0:
    # 初始化为无穷大
    grid[i][j] = float('inf')
  
    # 更新上、左、右的最小距离
    if i > 0:
      grid[i][j] = min(grid[i][j], grid[i - 1][j] + 1)
    if j > 0:
      grid[i][j] = min(grid[i][j], grid[i][j - 1] + 1)
    if j + 1 < len(grid[0]):
      grid[i][j] = min(grid[i][j], grid[i][j + 1] + 1)

def solve(grid):
  # 第一遍从左上角到右下角更新距离
  for i in range(len(grid)):
    for j in range(len(grid[0])):
      update_distance(grid, i, j)
  
  # 第二遍从右下角到左上角更新距离
  for i in range(len(grid) - 1, -1, -1):
    for j in range(len(grid[0]) - 1, -1, -1):
      update_distance(grid, i, j)

完整代码

from typing import List

def solve(grid: List[List[int]]) -> List[List[int]]:
  for i in range(len(grid)):
    for j in range(len(grid[0])):
      if grid[i][j] == 1:
        grid[i][j] = 0
        continue
      update_distance(grid, i, j)
  return grid

总结

01矩阵算法是一个算法入门者的必学课程。通过本文的讲解,你已经掌握了它的原理和实现方式。只要你勤加练习,相信你一定能成为LeetCode算法中的佼佼者。

最后,祝愿你在算法的道路上收获满满,不断突破自我。