leetcode 48 矩阵旋转可以这么简单
一行代码解决矩阵旋转(方法三)。
方法1:

坐标法
def rotate(self, matrix):
n = len(matrix) # 求出矩阵长度
m = (n + 1) // 2 # 求出层数
for k in range(m):
t = n - 2 * k - 1 # 需旋转的次数
for i in range(t):
# 不考虑 i 考虑 i
# d1(左上),行与k成正比,列与k成正比且与i成正比 [k][k] ---------------》 [k][k + i]
# d2(左下),行与k成反比且与i成反比,列与k成正比 [n - 1 - k][k] [n - 1 - k - i][k]
# d3(右下),行与k成反比,列与k成反比且与i成反比 [n - 1 - k][n - 1 - k] [n - 1 - k][n - 1 - k - i]
# d4(右上),行与k成正比且与i成正比,列与k成反比 [k][n - 1 - k] [k + i][n - 1 - k]
temp = matrix[k][k + i] #k代表层
matrix[k][k + i] = matrix[n - 1 - k - i][k] # k层 左上角 行不变 左下角 列不变
matrix[n - 1 - k - i][k] = matrix[n - 1 - k][n - 1 - k - i]
matrix[n - 1 - k][n - 1 - k - i] = matrix[k + i][n - 1 - k]
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(先对矩阵转置,然后进行水平翻转):
class Solution1: #转置和水平翻转两个步骤。
def rotate(self, matrix) -> None:
for i in range(len(matrix)):
for j in range(i, len(matrix[0])):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] for row in matrix:
row.reverse()
方法3(一行代码实现,巧用ZIP函数):
def rotate1(self, matrix):
matrix[:] = list(map(list,zip(*matrix[::-1])))
我们看看方法三做了什么?
[[1,2,3],
[4,5,6],
[7,8,9]]
先对矩阵进行了逆序:
test = [[1,2,3],
[4,5,6],
[7,8,9]]
print(test[::-1])
print(list(zip(*test[::-1]))) #解压之后内部为元组,所以使用map迭代式 list
print(list(map(list,zip(*test[::-1]))))

leetcode 48 矩阵旋转可以这么简单的更多相关文章
- [LeetCode]Rotate Image(矩阵旋转)
48. Rotate Image Total Accepted: 69437 Total Submissions: 198781 Difficulty: Medium You are give ...
- 前端与算法 leetcode 48. 旋转图像
目录 # 前端与算法 leetcode 48. 旋转图像 题目描述 概要 提示 解析 解法一:转置加翻转 解法二:在单次循环中旋转 4 个矩形 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...
- [array] leetcode - 48. Rotate Image - Medium
leetcode - 48. Rotate Image - Medium descrition You are given an n x n 2D matrix representing an ima ...
- 利用neon技术对矩阵旋转进行加速
一般的矩阵旋转操作都是对矩阵中的元素逐个操作,假设矩阵大小为m*n,那么时间复杂度就是o(mn).如果使用了arm公司提供的neon加速技术,则可以并行的读取多个元素,对多个元素进行操作,虽然时间复杂 ...
- 洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】
威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nnn行mmm列的矩阵. 每一个护符都有自己的魔力值.现在为了测试圣剑,你需要将这些护符分成 A,B两部分. 要求如下: 圣剑的所有护符, ...
- LeetCode:矩阵置零【73】
LeetCode:矩阵置零[73] 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [ [1,1,1], ...
- LeetCode 61:旋转链表 Rotate List
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. Given a linked list, rotate the list to the right by k pla ...
- matlab中矩阵的表示与简单操作
原文地址为:matlab矩阵的表示和简单操作 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ]”内: b.矩阵的同行元素之间用空格(或”,”)隔开: c.矩阵的行与行之间 ...
- zoj 2974 Just Pour the Water (矩阵快速幂,简单)
题目 对于案例的解释请见下图: 这道要变动提取一下矩阵,之后就简单了 具体解释可看代码: #include <string.h> #include <stdio.h> #inc ...
随机推荐
- Ruby元编程:动态添加类属性及其实际应用
上个星期测试道的Monkey老师和我聊到测试用例参数过多的问题,其实这样的问题在我这里也同样经历过.比如我的测试用例必须面对不同的测试环境,每个环境有无数的参数,开发的最初阶段,因为参数少,所以就放在 ...
- sso和oauth2.0的简单了解学习
sso,单点登录,single sign on 缩写.sso多用于多个应用之间的切换,例如百度论坛.百度知道.百度云.百度文库等,在其中一个系统中登录,(登录有效期内)切换到另一个系统的时候,不必再次 ...
- 深入理解JVM(一)虚拟机内存
一 .前言 JVM是什么,我想诸位肯定都清楚. 好吧,我还是简答说一下JVM即Java虚拟机(够简单吧 233333). 虽然说,所有抛开操作系统,讲虚拟机的内容,都是耍流氓.但是,贫僧不修善果,就爱 ...
- Java面试通关宝典
1.说说Java中异常的分类: 答:可分为Error和Exception. 从概念角度分析: Error:是程序无法处理的系统错误,编译器不做检查: Exception:是程序可以处理的异常,捕获后可 ...
- F#周报2019年第26期
新闻 逐渐演化的.NET Core框架 Visual Studio提示与技巧 Windows Termina(预览) Microsoft在GitHub上的工程师从2000名增加至25000名 视频及幻 ...
- 汇编入门二 一些概念与PC组件
1.内存:想让CPU工作,必须提供指令与数据,而指令和数据存在于内存中. 2.指令和数据:有点抽象,上书(汇编语言 第二版): 3.存储单元:存储器(内存)被划分为多个存储单元,内个存储单元从0开始顺 ...
- 39 | 从小作坊到工厂:什么是Selenium Grid?如何搭建Selenium Grid?
- XML中如果有特殊字符,比如> < 解决方案
//只需要在代码前加这个就可以了<![CDATA[ 把代码写到这个位置 ]]>
- 对于Spring中AOP,DI,IoC概念的理解
IOC IoC(inversion of Control),控制反转.就好像敏捷开发和SCRUM一样,不是什么技术,而是一种方法论,一种工程化的思想.使用IoC的思想意味着你将设计好的对象交给容器控制 ...
- 致远A8任意文件写入漏洞_getshell_exp
近期爆出致远 OA 系统的一些版本存在任意文件写入漏洞,远程攻击者在无需登录的情况下可通过向 URL /seeyon/htmlofficeservlet POST 精心构造的数据即可向目标服务器写入任 ...