题目描述
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
题解
这个题目搞了一个多小时。思路已经想好了难在两个循环的次数上。我的思路跟官方的不太一样。
因为需要原地转换,所以只能想到交换。注意交换规则是
m
a
t
r
i
x
[
r
o
w
]
[
c
o
l
]
=
m
a
t
r
i
x
[
c
o
l
]
[
n
−
r
o
w
−
1
]
matrix[row][col] =matrix[col][n-row-1]
matrix[row][col]=matrix[col][n−row−1]
我像剥洋葱一样,从外面一层一层去做这个事情。
左上角的第一个元素,与其旋转90度的元素进行交换。该元素被交换到了左上角,此时与他本应该交换的右下角元素交换。
原始右下角元素被交换到了左上角,依此类推,完成第一次交换。这里一次旋转成功4个元素。
假设该行的长度是in_n,那么这个操作只需要做in_n-1次。注意每少一层,in_n减少两个长度,即in_n-2*i。
矩阵长度为n,偶数时需要做n/2次,奇数时只需要做n//2次,少做一次。所以只需要做n//2次。
最后要写出交换的各个索引。每一层(每一圈)初始的索引是(i,i+x).
代码
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
for i in range(n//2):
in_n=n-2*i
for x in range(in_n-1):
j=i+x
ci = j
cj = n-i-1
matrix[i][j], matrix[ci][cj] = matrix[ci][cj], matrix[i][j]
matrix[i][j], matrix[cj][n-ci-1] = matrix[cj][n-ci-1], matrix[i][j]
matrix[i][j], matrix[n-ci-1][n-cj-1] = matrix[n-ci-1][n-cj-1], matrix[i][j]