返回

巧妙实现矩阵旋转:LeetCode 48「图像旋转」深度剖析

前端

问题概述:
LeetCode 48「旋转图像」问题要求您将给定的 n x n 二维矩阵顺时针旋转 90 度。

例如:

给定 matrix =
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
]

旋转后得到:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

深度解析最优解法:

解决该问题的最优解法采用巧妙的思想将旋转过程拆解为多个步骤,具体步骤如下:

  1. 先转置矩阵:
    • 首先,我们将矩阵按主对角线进行转置。转置操作是指将矩阵的行和列交换。
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
]

转置后:

[
  [1,4,7],
  [2,5,8],
  [3,6,9]
]
  1. 再反转每一行:
    • 然后,我们将转置后的矩阵按行反转。反转操作是指将矩阵的每一行从左到右进行反转。
[
  [1,4,7],
  [2,5,8],
  [3,6,9]
]

反转每一行:

[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]
  1. 最终输出:
    • 经过以上两个步骤,我们成功地将矩阵顺时针旋转了 90 度。

代码实现:

为了帮助您更好地理解该算法,我们提供了详细的 Python 代码实现:

def rotate_image(matrix):
  # 转置矩阵
  for i in range(len(matrix)):
    for j in range(i, len(matrix)):
      matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

  # 反转每一行
  for i in range(len(matrix)):
    matrix[i].reverse()

  return matrix

进一步优化:

该算法的时间复杂度为 O(n^2),其中 n 为矩阵的大小。如果我们想进一步优化该算法,可以采用更加巧妙的思想:

def rotate_image_optimized(matrix):
  # 将矩阵按左上角和右上角的对角线进行折叠
  for i in range(len(matrix)):
    for j in range(len(matrix) // 2):
      matrix[i][j], matrix[i][len(matrix) - j - 1] = matrix[i][len(matrix) - j - 1], matrix[i][j]

  # 将矩阵按中心垂直对称轴进行折叠
  for i in range(len(matrix) // 2):
    for j in range(len(matrix)):
      matrix[i][j], matrix[len(matrix) - i - 1][j] = matrix[len(matrix) - i - 1][j], matrix[i][j]

  return matrix

结语:

通过分析LeetCode 48「旋转图像」问题,我们不仅掌握了巧妙的矩阵旋转算法,同时也提高了您在LeetCode上的编程和算法技巧。希望您能学以致用,继续探索和征服更多编程难题!