矩阵旋转的解决
时间:2022-07-23
本文章向大家介绍矩阵旋转的解决,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天做了一道 leetcode 关于矩阵旋转(rotate-image,点击可查看原题)的题目,自己写了一种解法(基于Python),网上也看到一些比较好的解决方式,借此做一个总结。
阅读本文可能需要 5-8 分钟
题意分析
题目是英文的,但是看这个题目英文理解起来也不是很困难。关键词: 1、matrix: 矩阵 2、2D matrix: 二维矩阵 3、rotate: 旋转 4、clockwise: 顺时针 5、90 degrees: 90度
即:我们需要将一个二维矩阵顺时针旋转90度。 理解题意之后,我们还需要关注下题目中额外的要求,即 note 部分,关键词: 1、in-place: 原地修改 2、do not allocate another 2D matrix: 不能新定义一个二维矩阵做为中间变量
这里有点小投机的是,题目中说的是不能新定义一个二维矩阵,不是说不能去新开辟空间,所以一度程序上是有简化的。
解题思路
规律很容易得出来,难得是不能定义一个新的二维矩阵,所以这里先生成一个目标的一维矩阵,然后通过一定规律再依次赋值给原矩阵。代码如下:
"""
https://leetcode.com/problems/rotate-image/submissions/
解题思路:
转换规律是:
matrix[row][col] 转换后的位置为 matrix[col][total_row - 1 - row]
这里的 row 与 col 均从 0 开始计算
因为只能原地修改原二维矩阵,也不能重新分配一个新的二维矩阵,
所以投机了一下,先生成了一个和目标矩阵顺序的一维矩阵,
然后循环取值赋值给原二维矩阵
举例如下:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
real_matrix = [7, 4, 1, 8, 5, 2, 9, 6, 3]
赋值规律:
matrix[row][col] = real_matrix[row*total_row+col]
"""
class Solution:
def rotate(self, matrix):
total_row = len(matrix)
real_matrix = [matrix[col][total_row - 1 - row] for row in range(total_row -1, -1, -1) for col in range(total_row - 1, -1, -1)]
# matrix[::] = [m[i*total_row:total_row+i*total_row] for i in range(total_row)]
# 上面一行代码等于下面三行代码
# 不能使用 matrix = [...],因为这相当于是重新分配空间,而 matrix[::] 是在原列表上做修改
for row in range(total_row):
for col in range(total_row):
matrix[row][col] = real_matrix[row*total_row+col]
# 测试
if __name__ == '__main__':
s = Solution()
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("before rotate: {}".format(matrix))
s.rotate(matrix)
print("after rotate: {}".format(matrix))
其他方法
在 leetcode-discuss 页面,看了一些别人的写法,思路比较清晰也比较通用,解决方法即通过多次转换:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
=> 倒序
_temp = [
[7, 8, 9],
[4, 5, 6],
[1, 2, 3],
]
=> 行转列
target_matrix = [
[7, 4, 1],
[8, 5, 2],
[9, 6, 3],
]
按照上面的思路,可以用一句话解决,代码如下
matrix[::] = [[row[i] for row in matrix[::-1]] for i in range(len(matrix[0]))]
"""
分析如下:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[row[i] for row in matrix[::-1]]
首先 [row for row in matrix[::-1]]
执行结果为 _temp = [[7, 8, 9], [4, 5, 6], [1, 2, 3]]
外层循环 i 从 0 开始,相当先取 _temp 第0列的值,赋值给第0行,依次得到结果
"""
扩展
上面的解题思路,不仅试用于顺时针,也适用于逆时针,可参考 A common-method。即:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
=> 行转列
_temp = [
[1, 4, 7],
[2, 5, 8],
[3, 6, 9]
]
=> 倒序
target_matrix = [
[3, 6, 9],
[2, 5, 8],
[1, 4, 7]
]
Python 实现如下:
matrix[::] = [[row[i] for row in matrix] for i in range(len(matrix[0]))][::-1]
- Hyperledger Fabric Chaincode 开发
- 使用VS Code开发asp.net core
- 以太坊·将自定义数据写入到区块链中
- 使用TensorFlow实现股票价格预测深度学习模型
- 06-移动端开发教程-fullpage框架
- 07-移动端开发教程-移动端视口
- 10-移动端开发教程-移动端事件
- 08-移动端开发教程-移动端适配方案
- 09-移动端开发教程-Sass入门
- 开发者的如何优雅的使用OSX
- Solidity 智能合约开发语言·数据类型
- 以太坊·Rinkeby 测试网络
- TensorFlow强化学习入门(0)——Q-Learning的查找表实现和神经网络实现
- 【云端架构】网站运维之CDN链接鉴权示例入门(PHP)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android ButtonOnClick事件的写法总结
- Android 自定义弹出菜单和对话框功能实例代码
- linux文件管理命令实例分析【权限、创建、删除、复制、移动、搜索等】
- Android编程操作手机通讯录的方法示例
- Android中oncreate中获得控件高度或宽度的实现方法
- Android编程自定义对话框(Dialog)位置及大小的方法
- android端实现验证码随机生成功能
- Android编程实现切换imageView的方法分析
- 猿实战20——商品发布之sku与笛卡尔乘积的那些事儿
- 浅谈Android单元测试的作用以及简单示例
- linux上传并配置jdk和tomcat的教程详解
- Android SQLite事务处理结合Listview列表显示功能示例
- Android开发之如何自定义数字键盘详解
- 在Android上实现HttpServer的示例代码
- Linux /etc/network/interfaces配置接口方法