以前貌似做过类似的题目,所以第一个想法就是按照老思路来做,按照每一圈,一圈一圈来旋转:
在上图中,j表示现在旋转圈的上部所在的行,i表示现在旋转到了第几列,现在我们就可以将第[j,i]位置的数旋转:
temp = A[j][i]
A[j][i] = A[n-1-i][j]
A[n-1-i][j] = A[n-1-j][n-1-i]
A[n-1-j][n-1-i] = A[i][n-1-j]
A[i][n-1-j] = temp
然后从第一行开始,直到旋转到中间的行为止:
class Solution:
def rotate(self, A: 'List[List[int]]') -> 'None':
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(A)
for j in range(int(n/2)):
for i in range(j, n-j-1):
temp = A[j][i]
A[j][i] = A[n-1-i][j]
A[n-1-i][j] = A[n-1-j][n-1-i]
A[n-1-j][n-1-i] = A[i][n-1-j]
A[i][n-1-j] = temp
当然,还有另外一种很简单的做法:
- 将整个矩阵按照主对角线翻转
- 将矩阵按照最中间的列进行翻转
<真tm简单>
class Solution:
def rotate(self, A):
n = len(A)
for i in range(n):
for j in range(i):
A[i][j], A[j][i] = A[j][i], A[i][j]
for row in A:
for j in range(n/2):
row[j], row[~j] = row[~j], row[j]