Problem:48. 旋转图像

旋转图像

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]
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UGOTNOSHOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值