zoukankan      html  css  js  c++  java
  • LeetCode48, 如何让矩阵原地旋转90度

    本文始发于个人公众号:TechFlow,原创不易,求个关注


    今天是LeetCode第29篇,我们来看一道简单的矩阵旋转问题。

    题意

    题目的要求很简单,给定一个二维方形矩阵,要求返回矩阵旋转90度之后的结果。

    下面我们来看两个例子:

    题解

    这个动图一看就明白了,也就是说我们需要将一个二维矩阵顺时针旋转90度。这个题意我们都很好理解,但是题目当中还有一个限制条件:我们不能额外申请其他的数组来辅助,也就是对我们的空间利用进行了限制。

    如果没有这个条件限制其实很容易,我们只需要算出每一个坐标旋转之后的位置,我们重新创建一个数组然后依次填充就行了。

    我们忽略矩阵当中具体的数据,而来看看矩阵旋转前后的坐标变化。这是矩阵旋转之前的坐标:

    旋转之后,坐标变成了:

    我们对照上面两张图观察一下,可以看出对于坐标(i, j)来说,它旋转90度之后得到的结果应该是(j, n-1-i)。这里的n是行数。

    我们有了这个式子之后,我们可以继续推广。我们发现(i, j)位置的点旋转之后到了(j, n-1-i)。而(j, n-1-i)位置的点旋转之后到了(n-1-i, n-1-j),同理(n-1-i, n-1-j)旋转之后到了(n-1-j, i),最后我们发现(n-1-j, i)旋转之后回到了(i, j)。

    也就是说对于一次旋转来说,(i, j), (j,n-1-i), (n-1-i, n-1-j), (n-1-j, i)这四个位置的元素互相交换了位置,并没有影响到其他位置。其实这个也是很容易想明白的,因为题目给定的是一个方阵。

    我们看下下图就理解了:

    也就是说我们只需要遍历矩阵四分之一的部分,然后通过坐标拿到互相交换的4个位置,然后交换它们的元素即可。

    代码

    代码真的很简单,只有几行:

    class Solution:
        def rotate(self, matrix: List[List[int]]) -> None:
            """
            Do not return anything, modify matrix in-place instead.
            """

            n = len(matrix)
            
            # 注意一下范围和下标即可
            for i in range(n//2):
                for j in range(i, n-1-i):
                    matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i] = 
                    matrix[n-1-j][i], matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j]

    今天的文章就是这些,如果觉得有所收获,请顺手点个关注或者转发吧,你们的举手之劳对我来说很重要。

  • 相关阅读:
    XML与JSON的对比
    WPF dataGrid下的ComboBox的绑定
    WPF 导出Excel(合并单元格)
    WPF x:key和x:name用法
    WPF Canvas
    WPF Visibility属性用法
    AxInterop.ShockwaveFlashObjects.dll 问题
    BadImageFormatException,未能加载正确的程序集XXX的解决办法
    inner join ,left join ,right join区别
    Mac系统下php.ini的位置
  • 原文地址:https://www.cnblogs.com/techflow/p/12687271.html
Copyright © 2011-2022 走看看