返回

转动变化,图形重现!LeetCode 旋转图像题解

前端

揭开「旋转图像」的秘密:LeetCode 算法题详解

在 LeetCode 算法题库中,旋转图像是一个备受推崇的经典题目,考验着算法初学者的基本功。这道题目看似简单,实则蕴含着巧妙的解法和深刻的算法思想。今天,我们就将踏上解谜之旅,一步步揭开「旋转图像」背后的奥秘。

题目概述

「旋转图像」的题目要求如下:

给定一个 n x n 的二维矩阵,将其旋转 90 度。

举个例子,如果给定的矩阵是:

1 2 3
4 5 6
7 8 9

旋转 90 度后的结果应该为:

7 4 1
8 5 2
9 6 3

问题分析

要解开「旋转图像」之谜,首先需要对问题进行深入分析。观察给定的矩阵,我们可以发现它的旋转本质上是一种元素的重新排列。具体来说,对于一个 n x n 的矩阵,我们可以将它划分为四个象限,然后将这四个象限中的元素按照顺时针方向依次旋转 90 度。

算法讲解

基于上述分析,我们可以设计出一种高效的算法来解决「旋转图像」问题:

  1. 划分象限: 将矩阵划分为四个象限,即左上角象限、右上角象限、左下角象限和右下角象限。

  2. 旋转子矩阵: 将每个象限中的元素按照顺时针方向依次旋转 90 度。

  3. 重新组合: 将旋转后的四个象限重新组合成一个完整的矩阵。

代码实现

以下是用 Python 实现的「旋转图像」算法代码:

def rotate_image(matrix):
  """
  旋转一个 n x n 的二维矩阵。

  Args:
    matrix: 一个 n x n 的二维矩阵。

  Returns:
    一个旋转后的 n x n 的二维矩阵。
  """

  n = len(matrix)

  # 划分为四个象限
  submatrix1 = matrix[:n//2][:]
  submatrix2 = matrix[:n//2][n//2:]
  submatrix3 = matrix[n//2:][:n//2]
  submatrix4 = matrix[n//2:][n//2:]

  # 旋转每个象限
  submatrix1 = rotate_submatrix(submatrix1)
  submatrix2 = rotate_submatrix(submatrix2)
  submatrix3 = rotate_submatrix(submatrix3)
  submatrix4 = rotate_submatrix(submatrix4)

  # 重新组合
  rotated_matrix = []
  rotated_matrix.extend(submatrix1)
  rotated_matrix.extend(submatrix2)
  rotated_matrix.extend(submatrix3)
  rotated_matrix.extend(submatrix4)

  return rotated_matrix


def rotate_submatrix(submatrix):
  """
  旋转一个子矩阵。

  Args:
    submatrix: 一个子矩阵。

  Returns:
    一个旋转后的子矩阵。
  """

  n = len(submatrix)

  # 转置
  for i in range(n):
    for j in range(i + 1, n):
      submatrix[i][j], submatrix[j][i] = submatrix[j][i], submatrix[i][j]

  # 翻转每一行
  for i in range(n):
    submatrix[i].reverse()

  return submatrix

时间复杂度和空间复杂度

上述算法的时间复杂度为 O(n^2),其中 n 是矩阵的边长。这是因为算法需要遍历矩阵中的所有元素,并将每个元素旋转 90 度。空间复杂度为 O(1),因为算法没有使用额外的空间来存储旋转后的矩阵。

常见问题解答

1. 为什么需要将矩阵划分为象限?

将矩阵划分为象限可以将旋转问题分解成四个较小的子问题,从而简化了解决过程。

2. 为什么需要旋转每个子矩阵?

旋转每个子矩阵是为了将元素重新排列成 90 度的顺时针方向。

3. 为什么需要重新组合象限?

旋转后的象限需要重新组合成一个完整的矩阵,以得到最终的旋转结果。

4. 这个算法适用于所有矩阵吗?

是的,这个算法适用于所有 n x n 的二维矩阵,其中 n 是正整数。

5. 除了上述算法之外,还有其他旋转图像的方法吗?

是的,还有其他方法可以旋转图像,例如使用「原地旋转」算法,该算法不需要额外的空间来存储旋转后的矩阵。

总结

「旋转图像」是一个经典的 LeetCode 算法题,通过解决这道题目,我们可以深入理解图像操作的基本算法思想。本篇文章从题目分析到算法讲解,再到代码实现和常见问题解答,循序渐进地揭开了「旋转图像」背后的秘密。掌握这道题目不仅可以提升算法能力,更重要的是对算法问题的分析和解决过程有了更深刻的理解。