题目:
思路:
对于这道题我的想法是分两步进行旋转
首先,调换数组的正对角线元素:
调换前
[
[1,2,3],
[4,5,6],
[7,8,9]
]
调换之后:
[
[9,6,3],
[8,5,2],
[7,4,1]
]
第一步的的方法是:设n=len(matrix),对于两个对角线元素(x1,y1),(x2,y2),有x1+y2=n-1; x2+y1=n-1
因此利用这一点,交换对角线元素,为第二步交换做准备
第二步:
交换对应行的所有元素
取(n+1)/2作为边界(防止交换完之后又换回来了),列不动,将行按照i=n-1-i
的规律进行交换,如下所示
交换前:
[
[9,6,3],
[8,5,2],
[7,4,1]
]
交换后:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
代码如下:
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):
for j in range(n-i):
matrix[i][j], matrix[n-1-j][n-1-i] = matrix[n-1-j][n-1-i], matrix[i][j]
# 翻转矩阵,调换每一行
for j in range(n):
for i in range(int((n+1)/2)):
matrix[i][j], matrix[n-1-i][j] = matrix[n-1-i][j], matrix[i][j]