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

方法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 矩阵旋转可以这么简单的更多相关文章

  1. [LeetCode]Rotate Image(矩阵旋转)

    48. Rotate Image     Total Accepted: 69437 Total Submissions: 198781 Difficulty: Medium You are give ...

  2. 前端与算法 leetcode 48. 旋转图像

    目录 # 前端与算法 leetcode 48. 旋转图像 题目描述 概要 提示 解析 解法一:转置加翻转 解法二:在单次循环中旋转 4 个矩形 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  3. [array] leetcode - 48. Rotate Image - Medium

    leetcode - 48. Rotate Image - Medium descrition You are given an n x n 2D matrix representing an ima ...

  4. 利用neon技术对矩阵旋转进行加速

    一般的矩阵旋转操作都是对矩阵中的元素逐个操作,假设矩阵大小为m*n,那么时间复杂度就是o(mn).如果使用了arm公司提供的neon加速技术,则可以并行的读取多个元素,对多个元素进行操作,虽然时间复杂 ...

  5. 洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】

    威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nnn行mmm列的矩阵. 每一个护符都有自己的魔力值.现在为了测试圣剑,你需要将这些护符分成 A,B两部分. 要求如下: 圣剑的所有护符, ...

  6. LeetCode:矩阵置零【73】

    LeetCode:矩阵置零[73] 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   ...

  7. LeetCode 61:旋转链表 Rotate List

    ​给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. Given a linked list, rotate the list to the right by k pla ...

  8. matlab中矩阵的表示与简单操作

    原文地址为:matlab矩阵的表示和简单操作 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ]”内: b.矩阵的同行元素之间用空格(或”,”)隔开: c.矩阵的行与行之间 ...

  9. zoj 2974 Just Pour the Water (矩阵快速幂,简单)

    题目 对于案例的解释请见下图: 这道要变动提取一下矩阵,之后就简单了 具体解释可看代码: #include <string.h> #include <stdio.h> #inc ...

随机推荐

  1. 10 jQuery的事件绑定和解绑

    1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data ( ...

  2. Spring 注解编程之模式注解

    Spring 框架中有很多可用的注解,其中有一类注解称模式注解(Stereotype Annotations),包括 @Component, @Service,@Controller,@Reposit ...

  3. Spring Boot:使用Memcached缓存

    综合概述 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统.Memcached基于内存的key-value存储,用来存储小块的任意数据,这些数据可以是数据库调用.API调用或者是页面 ...

  4. WebGL概述

    WebGL,是一项用来在网页上绘制和渲染复杂三维图形(3D图形),并允许用户与之交互的技术.WebGL基于OpenGL ES 2.0,使用GLSL ES语言编写着色器.而 OpenGL ES (Ope ...

  5. 搭建本地pip源

    搭建本地的pip源 开发环境部署机器的时候, 每次从网上下载pip包会很慢, 将需要的包和相关依赖下载到本地, 搭建一个本地源服务器. 基本都是安装多个包, 推荐使用文件的方式, 文件内容格式, 可以 ...

  6. Go - Map 集合

    目录 概述 声明 Map 生成 JSON 编辑和删除 推荐阅读 概述 Map 集合是无序的 key-value 数据结构. Map 集合中的 key / value 可以是任意类型,但所有的 key ...

  7. "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''zhaoqiuyu' (`NAME`,`PRICE`,`COUNT`) values('电脑',1999,1)' at lin

    "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server v ...

  8. Hive入门(二)分区

    1 基本概念 1.1 什么是分区 Hive查询中一般会扫描整个表内容,会消耗很多时间.有时候只需要查询表中的一部分数据,因此建表时引入了partition(分区)概念. 表中的一个 Partition ...

  9. git中常用的操作命令有哪些?常用操作命令归纳

    git中常用的操作命令有哪些?本篇文章就给到大家归纳了一些git中常用操作命令.有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. git开始 全局配置:配置用户名和e-mail地址 1 ...

  10. 简述vue中父子组件是怎样相互传递值的(基础向)

    前言 首先,你需要知道vue中父组件和子组件分别指的是什么?   父组件:vue的根实例——用new Vue()构造函数创建的vue实例(实例会有一个挂载点,挂载点里的所有内容可理解为父组件的内容) ...