classSolution: defrotate(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ # m = copy.deepcopy(matrix) # 深拷贝,改变新m不会导致同时改变原matrix l = len(matrix) m = [[0]*l for _ inrange(l)] for i inrange(l-1,-1,-1): for j inrange(0,l): # 正向遍历 m[j][l-1-i] = matrix[i][j] # 找规律,第i行第j列的数正好转到了第j行倒数第i列 matrix[:] = m
方法2、原地旋转
思路:观察关键等式:$m[j][l-i-1]=m[i][j]$,不断的旋转,得到
从下旋转到上,发现四个等式一循环。
$m[i][j]=m[l-j-1][i]$
$m[l-j-1][i]=m[l-i-1][l-j-1]$
$m[l-i-1][l-j-1]=m[j][l-i-1]$
$m[j][l-i-1]=m[i][j]$
时间复杂度:O(n^2^)。遍历$[n/2]*[(n+1)/2]=O(n^2)$
空间复杂度:O(1)。
1 2 3 4 5 6 7 8 9 10
classSolution: defrotate(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ # 原地旋转 n = len(matrix) for i inrange(n//2): for j inrange((n+1)//2): matrix[i][j], matrix[n-j-1][i], matrix[n-i-1][n-j-1], matrix[j][n-i-1] = matrix[n-j-1][i], matrix[n-i-1][n-j-1], matrix[j][n-i-1], matrix[i][j]
方法3、解压、逆序取值
1 2 3 4 5 6 7 8 9
classSolution: defrotate(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ # 解压,相当于转置;然后每行逆序取值。 matrix[:] = list(zip(*matrix)) for i inrange(len(matrix)): matrix[i] = matrix[i][::-1]
classSolution: defrotate(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ # 水平翻转,主对角线翻转,正好为关键等式。 n = len(matrix) for i inrange(n//2): for j inrange(n): matrix[n-i-1][j], matrix[i][j] = matrix[i][j], matrix[n-i-1][j] # 主对角线翻转 for i inrange(n): for j inrange(i): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]