给定一个 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] ]
宏观调度
一层一层旋转,最外面一层按照某种对应规则逐步旋转,然后由外而内一层一层推进,直到完成。
对应规则也很简单,对于当前层级,四个四个换,首先把四个角上的元素旋转,然后往前走一步再旋转。
Python
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# 当前旋转边的左上角和右下角
leftTopRow, leftTopCol, rightDownRow, rightDownCol = 0, 0, len(matrix) - 1, len(matrix[-1]) - 1
while leftTopRow <= rightDownRow and leftTopCol < rightDownRow:
# 按照对应规则逐步旋转
for i in range(rightDownCol - leftTopCol):
matrix[leftTopRow][leftTopCol + i], matrix[leftTopRow + i][rightDownCol], \
matrix[rightDownRow][rightDownCol - i], matrix[rightDownRow - i][leftTopCol], = \
matrix[rightDownRow - i][leftTopCol], matrix[leftTopRow][leftTopCol + i], \
matrix[leftTopRow + i][rightDownCol], matrix[rightDownRow][rightDownCol - i]
# 完成旋转后更新层级
leftTopRow += 1
leftTopCol += 1
rightDownRow -= 1
rightDownCol -= 1
复杂度分析
- 时间复杂度:O(N2),外层while循环由于左上角和右下角同时走,N/2,里面for循环长度为矩阵一行的长度,N,所以O(N/2*N)=O(N2/2)=O(N2)
- 空间复杂度:O(1)