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 ...
随机推荐
- 一个基于jQuery写的弹窗效果(附源码)
最近项目中频繁遇到需要弹出窗口的功能,一直使用浏览器默认的Alert和Confirm弹窗,感觉视觉效果不是那么好,而从网上下载的话又找不到合适的,找到的话有些也是十分臃肿,有时候感觉学习配置的功夫自己 ...
- 转载几篇文章URL
读了百伯在线Jobbole的几篇文章,转给需要的朋友.如下: 产品小设计大体验:http://blog.jobbole.com/39593/ 苹果是一家有工程师的设计公司:Google是一家有设计师的 ...
- Java基础(六) static五大应用场景
static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.上一个章节我们讲了final关键字的原理及用法,本 ...
- epoll模型的探索与实践
我们知道nginx的效率非常高,能处理上万级的并发,其之所以高效离不开epoll的支持, epoll是什么呢?,epoll是IO模型中的一种,属于多路复用IO模型; 到这里你应该想到了,select, ...
- 浅谈ASP.NET Core中IOC与DI的理解和使用
说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但是一直觉得有点很难去理解,总觉得对其还是模糊不清,所以,趁着今天有空,就去把两个概念 ...
- webapi使用autofac
注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi,否则在运行时将出现“重写成员“Autofac.Integration.WebApi.AutofacWebApiD ...
- 【JVM】02垃圾回收机制
垃圾回收 垃圾回收策略https://blog.csdn.net/u010425776/article/details/51189318 程序计数器.Java虚拟机栈.本地方法栈都是线程私有的,也就是 ...
- Python初探-基础篇
python和其他语言其实是相似的,如果你会了另一门语言,那学习这个语言,会很快上手 1.mac下自带的有python,版本为2.7.0(可以用home brew python3 安装最新版本的pyt ...
- yii DAO操作总结
数据库代码: /* Navicat MySQL Data Transfer Source Server : lonxom Source Server Version : 50524 S ...
- Failed to start Docker Application Container Engine.
[root@dockertest ~]# systemctl status docker.service● docker.service - Docker Application Container ...