返回
巧妙实现矩阵旋转:LeetCode 48「图像旋转」深度剖析
前端
2024-01-27 01:43:03
问题概述:
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,2,3],
[4,5,6],
[7,8,9]
]
转置后:
[
[1,4,7],
[2,5,8],
[3,6,9]
]
- 再反转每一行:
- 然后,我们将转置后的矩阵按行反转。反转操作是指将矩阵的每一行从左到右进行反转。
[
[1,4,7],
[2,5,8],
[3,6,9]
]
反转每一行:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
- 最终输出:
- 经过以上两个步骤,我们成功地将矩阵顺时针旋转了 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上的编程和算法技巧。希望您能学以致用,继续探索和征服更多编程难题!