返回

LeetCode 54:螺旋矩阵技巧

人工智能

导读

在今天的LeetCode专题文章中,我们将一起学习第54题——螺旋矩阵。这道题目的重点在于使用螺旋的方式遍历一个二维数组,并且需要兼顾数组的边界情况。通过这篇文章,你将学习到一些实用的编程技巧,例如如何使用循环和条件语句来控制遍历过程,以及如何处理数组的边界情况。

题目分析

LeetCode 54题螺旋矩阵的题目如下:

给定一个包含 m x n 个元素的矩阵,请按照顺时针螺旋顺序,返回矩阵中的所有元素。

例如,对于矩阵:

[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

返回的顺序应为:[1, 2, 3, 6, 9, 8, 7, 4, 5]。

从题目中可以看出,我们需要按照顺时针螺旋顺序遍历矩阵中的所有元素。为了实现这一点,我们可以使用四个循环来控制遍历过程:

  • 外层循环用于控制遍历的行数。
  • 内层循环用于控制遍历的列数。
  • 两个条件语句用于处理数组的边界情况。

算法设计

根据题目的分析,我们可以设计出如下算法来解决这道题目:

  1. 初始化四个变量:leftrighttopbottom,分别表示矩阵的左边界、右边界、上边界和下边界。
  2. 使用两个循环来遍历矩阵,外层循环控制行数,内层循环控制列数。
  3. 在循环中,使用条件语句来判断当前位置是否在矩阵的边界内,如果在边界内,则将当前位置的元素添加到结果列表中。
  4. 每次循环结束后,更新leftrighttopbottom的值,以缩小矩阵的边界。
  5. 重复步骤2-4,直到遍历完整个矩阵。

代码实现

def spiral_matrix(matrix):
  """
  :type matrix: List[List[int]]
  :rtype: List[int]
  """
  if not matrix:
    return []

  m, n = len(matrix), len(matrix[0])
  left, right, top, bottom = 0, n - 1, 0, m - 1
  result = []

  while left <= right and top <= bottom:
    # 从左到右遍历顶部边界
    for i in range(left, right + 1):
      result.append(matrix[top][i])

    # 从上到下遍历右侧边界
    for i in range(top + 1, bottom):
      result.append(matrix[i][right])

    # 从右到左遍历底部边界
    if top < bottom:
      for i in range(right, left - 1, -1):
        result.append(matrix[bottom][i])

    # 从下到上遍历左侧边界
    if left < right:
      for i in range(bottom - 1, top, -1):
        result.append(matrix[i][left])

    # 更新边界
    left += 1
    right -= 1
    top += 1
    bottom -= 1

  return result

结语

通过这篇文章,你学习到了LeetCode 54题螺旋矩阵的技巧,以及如何使用Python语言来解决这道题目。希望这篇文章对你的LeetCode学习有所帮助。