题目描述
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
解题思路
经观察可知,需经过四步才能完成一个元素的一轮交换。当外圈旋转结束后,缩小至内圈进行下一轮旋转。每圈需交换元素数目为第一行的前n-1个,其中n是当前矩阵的维度。
交换函数如下:
def rotate(i, j, bound, matrix):
temp = matrix[i][j]
matrix[j][bound], temp = temp, matrix[j][bound]
matrix[bound][bound - j+i], temp = temp, matrix[bound][bound - j+i]
matrix[bound - j+i][i], temp = temp, matrix[bound - j+i][i]
matrix[i][j] = temp
其中,i表示当前圈的起始行数,j表示第i行正在进行旋转交换的起始元素,bound表示当前圈的边界。
代码
class Solution(object):
def rotate(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
def rotate(i, j, bound, matrix):
temp = matrix[i][j]
matrix[j][bound], temp = temp, matrix[j][bound]
matrix[bound][bound - j+i], temp = temp, matrix[bound][bound - j+i]
matrix[bound - j+i][i], temp = temp, matrix[bound - j+i][i]
matrix[i][j] = temp
n = len(matrix)
bound=n-1
i = 0
temp = None
while bound > i:
for j in range(i, bound):
rotate(i, j, bound, matrix)
#缩小一圈
bound=bound-1
i += 1
结果
反思
目前执行速度最快的代码如下:
class Solution:
"""
@param matrix: A list of lists of integers
@return: Nothing
"""
def rotate(self, matrix):
# write your code here
n = len(matrix)
for i in range(n):
for j in range(i+1, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
for i in range(n):
matrix[i].reverse()
其观察到的规律是:先转置矩阵,再将每行反转。