LeetCode-048旋转图像,先转置再翻转,如何变成?
摘要:本题在线练习:LeetCode 48. 旋转图像 - 在线练习(免费 · 无需登录 · AI 辅助)(https:onefly.topzero2Leetcodeplayground
本题在线练习:LeetCode 48. 旋转图像 - 在线练习(免费 · 无需登录 · AI 辅助)(https://onefly.top/zero2Leetcode/playground.html?id=48)
配套刷题网站 Zero2Leetcode —— 内置本地 OJ + AI 教练,零门槛开始刷 Hot 100。
题目概述
给定一个 n x n 的二维矩阵 matrix,将其 顺时针旋转 90 度,要求 原地修改(不使用额外的 n x n 矩阵)。
这题最容易卡在“原地”两个字上:如果允许新建矩阵,很容易;原地则需要找到等价的分解步骤。
核心思路:顺时针 90 度 = 转置 + 每行反转
把坐标变化写出来更清楚:
顺时针旋转 90 度后:
(i, j) -> (j, n-1-i)
这个变换可以分两步完成:
转置(transpose):(i, j) -> (j, i)
每一行反转(reverse row):(j, i) -> (j, n-1-i)
两步叠加,正好得到顺时针 90 度。
代码实现(原地:转置 + 反转行)
class Solution:
def rotate(self, matrix: list[list[int]]) -> None:
n = len(matrix)
# 1) transpose
for i in range(n):
for j in range(i + 1, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
# 2) reverse each row
for i in range(n):
matrix[i].reverse()
逐行拆解:为什么 j 从 i+1 开始
转置时,只需要交换对角线以上(或以下)的元素:
如果 j 从 0 开始,会把 (i, j) 和 (j, i) 交换两次,等于没做。
让 j 从 i+1 开始,保证每对元素只交换一次。
手动模拟:3x3 示例
原矩阵:
1 2 3
4 5 6
7 8 9
转置后:
1 4 7
2 5 8
3 6 9
每行反转后:
7 4 1
8 5 2
9 6 3
这就是顺时针旋转 90 度的结果。
复杂度分析
时间:O(n^2)
空间:O(1)(原地交换)
总结
这题最值得记住的不是代码,而是等价分解:
顺时针旋转 90 度 = 先转置,再把每行反转。
很多“原地矩阵变换”题,都是先把坐标映射写清楚,再拆成可原地实现的两步或三步。
