LeetCode-矩阵旋转

题目描述:

给定一个 n×n 的2D矩阵,将其顺时针旋转90度。不能开辟新的矩阵空间
example:

given input matrix=
[
    [1,2,3],
    [4,5,6],
    [7,8,9]
]   
rotate the input matrix in place that it becomes:
[
    [7,4,1],
    [8,5,2],
    [9,6,3]
]

分析

这里写图片描述

以矩阵的(0,0)为坐标系原点建立坐标系,在此坐标系中有点 (i,j) ,经过顺时针90°旋转之后,坐标系变化成右图。那么相对于原来的坐标系来说,点的坐标变成了 (j,n1i)

  • 横纵坐标范围均为 [0,n1]
  • 根据上面右边的图可知,新点纵坐标为 j ,而横坐标为 n1i

分析可知:顺时针旋转90°,使得矩阵中的点的位置进行了如下变换:

(i,j)(j,ni1)

不能开辟新空间,意味着一次不能修改多个矩阵的值:因为被修改的 (i,j) 都需要被存储下来

解题

针对 n×n 矩阵,每次只修改以 (i,i) 为顶点的正方形的外圈。如下图所示:
这里写图片描述

  • 修改以 (i,i) 为顶点的一圈
  • 按照修改规则有点的移动:
    (i,j)(j,ni1)(ni1,nj1)(nj1,i)
    ,即
    M[nj1][i]=M[ni1][nj1]
    M[ni1][nj1]=M[j][ni1]
    M[j][nj1]=M[i][j]
    M[i][j]=M[nj1][i]

  • 注意
    上面最后一步中的 M[nj1][i] 已经在第一步中改变了,所以在变换开始前应该保存其值。
    而j只需要在上图中深色阴影范围内即可,上面的四个变换就包含了四条边,也就是说:
    j[i,n1i)

注意 i 标识这我们每次得到一个以(i,i)为定点的正方形,所以 i <script type="math/tex" id="MathJax-Element-47">i</script>的取值范围也有限定。

编码

def rotate(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: void Do not return anything, modify matrix in-place instead.
        """
        #(i,j)变成了(j,n-i-1)
        n = len(matrix)
        for i in range(int(math.floor(n/2+0.5))):
            for j in range(i,n-i-1):
                #旋转一圈
                a=matrix[n-j-1][i]
                matrix[n-j-1][i]=matrix[n-i-1][n-j-1]
                matrix[n - i - 1][n - j - 1]=matrix[j][n-i-1]
                matrix[j][n - i - 1]=matrix[i][j]
                matrix[i][j]=a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值