目录
二、二维数组简介
2.1 旋转矩阵
2.1.1 问题描述
2.1.2 求解过程
法一:不允许占用额外空间,那就只能原地操作 (in-place)。换言之,每次变换都必须一次完成,不可再访问。为此,可以选择从外层到内层,每次对四个相应位置元素按顺时针旋转 90°。循环层数 floor 由 n/2 向上取整确定。复杂度由 n*n/4 向上取整确定,即为 O(n^2)
2020/06/01 - 解法基本唯一
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# 每次调整4个, 共需 n*n/4 向上取整 次
n = len(matrix)
if n <= 1:
return matrix
#quo, rem = divmod(n, 2)
#floor = quo + rem
floor = sum(divmod(n, 2)) # 从外到内, 处理层数
# i 是每层的起始 index, 如最外层/第一次从[0][0]开始, 第二层从[1][1]开始 ...
for i in range(floor): # 层数
limit = n-i-1 # 当前层的 index 上限
k = 0 # index 调整辅助变量
for j in range(i, limit): # 每次同时顺时针调整4个元素位置
matrix[i][j], matrix[j][limit], matrix[limit][limit-k], matrix[limit-k][i] = \
matrix[limit-k][i], matrix[i][j], matrix[j][limit], matrix[limit][limit-k]
k += 1
return matrix