第 100 天时,我可能会对这 100 天以来的算法题进行一个总结,然后暂时停止更新 LeetCode 题解了。
下一步可能更新 NLP 相关算法了,非常感谢大家每天的支持。

题目链接

LeetCode 面试题 01.07. 旋转矩阵[1]

题目描述

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例1

给定 matrix =
[[1,2,3],[4,5,6],[7,8,9]
],
原地旋转输入矩阵,使其变为:
[[7,4,1],[8,5,2],[9,6,3]
]

示例2

给定 matrix =
[[ 5, 1, 9,11],[ 2, 4, 8,10],[13, 3, 6, 7],[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[[15,13, 2, 5],[14, 3, 4, 1],[12, 6, 8, 9],[16, 7,10,11]
]

题解

旋转

可以发现,每个格子旋转四次之后都会回到原位。所以对于每个格子,我们只需要交换和它相关的一共四个格子的位置就行了。

对于格子 (i, j) ,我们可以推算出它旋转后的三个新位置是 (j, n-1-i), (n-1-i, n-1-j), (n-1-j, i) 。所以只需要一个临时变量保存其中一个位置的值,然后按顺序交换位置就行了。

当然为了避免重复旋转,我们只能枚举四分之一的格子,如果 n 是偶数,如下图所示,我们可以这么划分:

如果 n 是奇数,可以如下图这么划分:

当然你也可以不规则的划分,如下图这样,只是代码写起来有点费劲:

翻转

这题还可以不通过模拟旋转来实现旋转。

上面说过了,格子 (i, j) 旋转后的新位置是 (j, n-1-i)

那么我们可以先沿着主对角线翻转矩阵,这样格子 (i, j) 位置就换到了 (j, i)

然后再左右翻转一下矩阵,格子 (j, i) 就换到了 (j, n-1-i) ,正好等价于旋转后的位置!

因为翻转每次只需要交换两个格子的位置,所以不需要任何额外变量。

再提一个交换两个元素的小 trick ,如代码里注释的那样,可以采用异或操作来规避额外变量。

代码

旋转(c++)

class Solution {public:void rotate(vector<vector<int>>& matrix) {int n = matrix.size();for (int i = 0; i < n/2; ++i) {for (int j = 0; j < (n+1)/2; ++j) {int tmp = matrix[n-1-j][i];matrix[n-1-j][i] = matrix[n-1-i][n-1-j];matrix[n-1-i][n-1-j] = matrix[j][n-1-i];matrix[j][n-1-i] = matrix[i][j];matrix[i][j] = tmp;}}}
};

翻转(c++)

class Solution {public:void rotate(vector<vector<int>>& matrix) {int n = matrix.size();for (int i = 0; i < n; ++i) {for (int j = i+1; j < n; ++j) {matrix[i][j] ^= matrix[j][i];matrix[j][i] ^= matrix[i][j];matrix[i][j] ^= matrix[j][i];// swap(matrix[i][j], matrix[j][i]);}}for (int i = 0; i < n; ++i) {for (int j = 0; j < n/2; ++j) {matrix[i][j] ^= matrix[i][n-1-j];matrix[i][n-1-j] ^= matrix[i][j];matrix[i][j] ^= matrix[i][n-1-j];// swap(matrix[i][j], matrix[i][n-1-j]);}}}
};

旋转(python)

class Solution:def rotate(self, matrix: List[List[int]]) -> None:n = len(matrix)for i in range(n//2):for j in range((n+1)//2):tmp = matrix[n-1-j][i]matrix[n-1-j][i] = matrix[n-1-i][n-1-j]matrix[n-1-i][n-1-j] = matrix[j][n-1-i]matrix[j][n-1-i] = matrix[i][j]matrix[i][j] = tmp

翻转(python)

class Solution:def rotate(self, matrix: List[List[int]]) -> None:n = len(matrix)for i in range(n):for j in range(i+1, n):matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]for i in range(n):for j in range(n//2):matrix[i][j], matrix[i][n-1-j] = matrix[i][n-1-j], matrix[i][j]

关注【算法码上来】,每日算法干货马上就来!

参考资料

[1]

LeetCode 面试题 01.07. 旋转矩阵: https://leetcode-cn.com/problems/rotate-matrix-lcci/

python 旋转矩阵_【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?相关推荐

  1. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  2. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  3. 蓄水池采样算法的python实现_常用算法-蓄水池抽样算法

    Leetcode上遇到一道题,题目是这样的: 这道题的关键是链表的长度不知道,但是要使随机返回每个元素的概率相等,这一下就难倒我了,如果知道链表的长度k,从0到k中随机选择一个整数就好了呀,可现在不知 ...

  4. 漫画算法python篇_漫画算法:小灰的算法之旅(Python篇)(全彩)

    商品参数 漫画算法-小灰的算法之旅(Python篇) 定价 79.00 出版社 电子工业出版社 版次 出版时间 2020年03月 开本 16开 作者 魏梦舒 装帧 平装-胶订 页数 字数 ISBN编码 ...

  5. k邻近算法python代码_机器学习算法之K近邻法-Python实现

    一.算法简介 k近邻法(k-nearest neighbor,k-NN)是一种基本的分类方法,输入的是实例的特征向量,对应于特征空间的点,输出结果为实例的类别,可以取多类.对于训练集来说,每个实例的类 ...

  6. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...

    题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...

  7. python 聚类_聚类算法中的四种距离及其python实现

    欧氏距离 欧式距离也就是欧几里得距离,是最常见也是最简单的一种距离,再n维空间下的公式为: 在python中,可以运用scipy.spatial.distance中的pdist方法来实现,但需要调整其 ...

  8. 分类算法python程序_分类算法——k最近邻算法(Python实现)(文末附工程源代码)...

    kNN算法原理 k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样 ...

  9. 层次聚类python实现_聚类算法之层次聚类(Python实现)

    起步 层次聚类( Hierarchical Clustering )是聚类算法的一种,通过计算不同类别的相似度类创建一个有层次的嵌套的树. 层次聚类算法介绍 假设有 n 个待聚类的样本,对于层次聚类算 ...

最新文章

  1. 拖放 DataGrid 列--来自MSDN
  2. WannaCry 不相信眼泪 它需要你的安全防御与响应能力
  3. CommonJs模块规范
  4. ipguard客户端如何卸载_客户端navicat遇到问题怎么办?
  5. 关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。
  6. Animate.css介绍
  7. toj 4596 一行盒子
  8. top、kill实现进程结束
  9. 程序员vim的最终解决方案
  10. C语言课后练习题第二章
  11. win7官方原版iso镜像
  12. acu风格是什么意思_acu 是什么意思,是一个品牌吗???
  13. la la love on my mind
  14. 微信公众号订阅号开发的学习(二):获取用户发送的消息、简单的自动回复、自定义菜单
  15. 125页6万字智慧城市系统及智慧城市运营中心建设技术方案
  16. 门诊地图导航怎么做,零成本的医院室内导航解决方案
  17. 维修记录 - 格兰仕光波炉
  18. BBS论坛 home主页与个人站点主页
  19. Excel作图-二维面积图展现占比变化
  20. HDU 4305 Lightning (高斯消元解kirchhoff矩阵+逆元)

热门文章

  1. 如何生成一副Poker
  2. 创业的一些挫见之第二家公司失败记录
  3. servlet request参数只能取一次解决方法
  4. js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件
  5. 什么是hypernetworks? hypernetworks简单介绍
  6. (Object detection)目标检测从入门到精通——第四部分anchor box
  7. python运行程序的时间计算
  8. 重量计算python月球_千年前的古诗,苏轼的不知月亮上是何年何月|现在我用Python来计算出来了...
  9. vimium插件_chrome插件神奇的vimium人性化设置
  10. ext列表禁止滑动_后台列表设计避坑指南(下)