zoukankan      html  css  js  c++  java
  • leetcode 48 矩阵旋转可以这么简单

    一行代码解决矩阵旋转(方法三)。

    方法1

    坐标法

     1 def rotate(self, matrix):
     2     n = len(matrix)  # 求出矩阵长度
     3     m = (n + 1) // 2  # 求出层数
     4     for k in range(m):
     5         t = n - 2 * k - 1  # 需旋转的次数
     6         for i in range(t):
     7             #                                        不考虑 i                                考虑 i
     8             # d1(左上),行与k成正比,列与k成正比且与i成正比 [k][k]  ---------------》 [k][k + i]
     9             # d2(左下),行与k成反比且与i成反比,列与k成正比 [n - 1 - k][k]            [n - 1 - k - i][k]
    10             # d3(右下),行与k成反比,列与k成反比且与i成反比 [n - 1 - k][n - 1 - k]    [n - 1 - k][n - 1 - k - i]
    11             # d4(右上),行与k成正比且与i成正比,列与k成反比 [k][n - 1 - k]            [k + i][n - 1 - k]
    12             temp = matrix[k][k + i]                  #k代表层
    13             matrix[k][k + i] = matrix[n - 1 - k - i][k]    # k层  左上角  行不变  左下角 列不变
    14             matrix[n - 1 - k - i][k] = matrix[n - 1 - k][n - 1 - k - i]
    15             matrix[n - 1 - k][n - 1 - k - i] = matrix[k + i][n - 1 - k]
    16             matrix[k + i][n - 1 - k] = temp

    解释代码:

    这里的坐标是不是很晕,这个是如何对应起来的呢?

    1、首先我们把矩阵的每一圈看做一次操作(底下的红色圈代表一次调整)

    对于宽度为n的我们需要 n/2次调整就可以结束。  这个次数为外层循环 K

    2、对于每一次调整我们需要进行多次操作,因为每一次我们调整四个点(图中黑点)

    每次往内缩缩小了2个格子  每一次内部调整次数为 n-2*k -1

     3、现在外部循环为1 中次数  内部为 2中次数,那么坐标关系怎么处理呢?

                           只考虑1                                           考虑2

    d1(左上)[k][k]                    [k][k+i]
    d2(左下)[n - 1 - k][k]            [n - 1 - k - i][k]
    d3(右下)[n - 1 - k][n - 1 - k]    [n - 1 - k][n - 1 - k - i]
    d4(右上)[k][n - 1 - k]            [k + i][n - 1 - k]

    第一步:我们先不考虑2 只考虑1中坐标变化关系 每一个点都是往内部走k为层数(对照上述的关系看) 

    当k变化时 d1(左上)坐标[0+k][0+k]   与k均成正比    d2(左下)坐标[n - 1 - k][k] 横坐标反比 纵坐标正比   以此类推。。。。。。

    第二步:现在考虑1 

    左上角坐标内部调整时,下一个为它右侧,纵坐标 ++   

    左下角坐标内部调整时,下一个为它上侧,横坐标  --  

    右下角坐标内部调整时,下一个为它左侧,纵坐标  -- 

    右上角坐标内部调整时,下一个为它下侧,横坐标 ++   

    方法2(先对矩阵转置,然后进行水平翻转):

    1 class Solution1:  #转置和水平翻转两个步骤。
    2     def rotate(self, matrix) -> None:
    3         for i in range(len(matrix)):
    4             for j in range(i, len(matrix[0])):
    5                 matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
    6 
    7         for row in matrix:
    8             row.reverse()

    方法3(一行代码实现,巧用ZIP函数):

    1 def rotate1(self, matrix):
    2     matrix[:] = list(map(list,zip(*matrix[::-1])))

    我们看看方法三做了什么?

    [[1,2,3],
    [4,5,6],
    [7,8,9]]

    先对矩阵进行了逆序:

    1 test = [[1,2,3],
    2         [4,5,6],
    3         [7,8,9]]
    4 print(test[::-1])
    5 print(list(zip(*test[::-1])))  #解压之后内部为元组,所以使用map迭代式 list
    6 print(list(map(list,zip(*test[::-1]))))

  • 相关阅读:
    【单调栈】求一个数组第一个比他小的数的位置
    【双向bfs】2017多校训练十 HDU 6171 Admiral
    【归并排序求逆序对个数】【树状数组求逆序对个数】
    【单调队列优化dp】uestc 594 我要长高
    【单调队列优化dp】HDU 3401 Trade
    【单调队列+尺取】HDU 3530 Subsequence
    linux下备份目录文件及目录
    浅谈 Python 的 with 语句
    SQLAlchemy中scoped_session
    pycharm自定义代码片段
  • 原文地址:https://www.cnblogs.com/WSX1994/p/11251275.html
Copyright © 2011-2022 走看看