旋转图像
1.思路
普通算法的思路非常简单,创建一个临时变量用来存储矩阵即可。需要着重说一下原地算法的思路,拿题目给的4*4的矩阵为例,我们可以有如下推导:
第一次更新
matrix[col][len(matrix) - row - 1] = matrix[row][col],有如下规律:
row -> col
col -> len(matrix) - row - 1
0,0 -> 0,3 ,即将matrix[0][0]的值赋给matrix[0][3]
第二次更新
令temp = matrix[col][len(matrix) - row - 1],由于此时row = col & col = len(matrix) - row - 1 ,应用上述规律变化可得matrix[len(matrix) - row - 1][len(matrix) - col - 1] = matrix[col][len(matrix) - row - 1]
0,3 -> 3,3,即将matrix[0][3]的值赋给matrix[3][3]
第三次更新
令temp = matrix[len(matrix) - row - 1][len(matrix) - col - 1],由于此时row = len(matrix) - row - 1 & col = len(matrix) - col - 1,同样的可得matrix[len(matrix) - col - 1][row] = matrix[len(matrix) - row - 1][len(matrix) - col - 1]
3,3 -> 3,0,即将matrix[3][3]的值赋给matrix[3][0]
第四次更新
令temp = matrix[col][len(matrix) - row - 1],由于row = col & col = len(matrix) - row - 1,同理可得matrix[row][col] = matrix[len(matrix) - col - 1][row]
3,0 -> 0,0 ,即将matrix[3][0]的值赋给matrix[0][0]
此时完成一个循环,即旋转了360度,每一次旋转完成四个元素的更新都是重复上述四步
于是有
matrix[col][len(matrix) - row - 1] = matrix[row][col]
matrix[len(matrix) - row - 1][len(matrix) - col - 1] = matrix[col][len(matrix) - row - 1]
matrix[len(matrix) - col - 1][row] = matrix[len(matrix) - row - 1][len(matrix) - col - 1]
matrix[row][col] = matrix[len(matrix) - col - 1][row]
现在我们已经得到了矩阵元素的交换规律,而循环条件又该怎么设置呢?像普通算法一样吗?可以试一下,如果我们把循环条件设置为与普通算法一样的话,结果和原始的matrix是一模一样的,这是因为在处理时,行和列是对称变换的,因此我们只需处理前一半的行和前一半的列的位置就可以,即如果是一个44的矩阵,只处理左上22的部分就可以,而对于奇数的方阵,无需再处理中间的那一行,所以行数是n//2,列数是(n+1)//2
2.复杂度
普通算法时间复杂度O(n2),空间复杂度O(n2)
原地算法时间复杂度O(n2),空间复杂度O(1)
3.解法一(普通算法)
import copy
class Solution:
def rotate(self, matrix: List[List[int]]):
temp_matrix = copy.deepcopy(matrix)
n = len(matrix)
for i in range(n):
for j in range(n):
matrix[i][j] = temp_matrix[n-j-1][i]
return matrix
4.解法二(原地算法)
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
for row in range(n // 2):
for col in range((n+1) // 2):
matrix[row][col],matrix[col][n - row - 1],matrix[n - row - 1][n - col - 1],matrix[n - col - 1][row] = \
matrix[n - col - 1][row],matrix[row][col],matrix[col][n - row - 1],matrix[n - row - 1][n - col - 1]