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 ...
随机推荐
- 最全java多线程学习总结1--线程基础
<java 核心技术>这本书真的不错,知识点很全面,翻译质量也还不错,本系列博文是对该书中并发章节的一个总结. 什么是线程 官方解释:线程是操作系统能够进行运算调度的最小单位,包含 ...
- Spring Boot:快速入门教程
什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
- appcan 多按钮提示框
使用 appcan.window.alert EG: var btnList=new Array(); btnList[0]="确认"; btnList[1]="取消& ...
- 长春理工大学第十四届程序设计竞赛(重现赛)L
L.Homework Stream 题目链接:https://ac.nowcoder.com/acm/contest/912/L 题目 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图 ...
- django-haystack+whoosh+jieba实现中文全文搜索
先上效果图 附上个人网站:https://liyuankun.cn 安装依赖库 注意:这里我们不安装django-haystack,因为要添加中文分词的功能很麻烦,所以我直接集成了一个中文的djang ...
- Oracle常用的一些 数据字典 转https://www.cnblogs.com/neozhu/archive/2008/07/22/1248422.html
Oracle常用数据字典表 Oracle常用数据字典表 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_ ...
- C++ 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题解
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 分析: 这棵树上有且仅有一个环 两种情况: 1.讨论一个点在环上,如果在则答案与它指向点相同, 2 ...
- WebApi 通过拦截器设置特定的返回格式
public class ActionFilter : ActionFilterAttribute { /// <summary> /// Action执行之后由MVC框架调用 /// & ...
- Discuz ML! V3.X 代码注入漏洞
Discuz ML! V3.X 代码注入漏洞 前言 Discuz!ML是一个由CodersClub.org创建的多语言,集成,功能齐全的开源网络平台,用于构建像"社交网络"这样的互 ...
- Mybatis辅助神器-MyBatis Log Plugin
1. 问题描述 Java操作数据库的两台流行天王-mybatis和hibernate,mytabis和hibernate的区别不想废话了,以前用hibernate,最近几年一直用的mybatis,目前 ...