当前位置: 首页 > news >正文

力扣48:旋转矩阵

力扣48:旋转矩阵

  • 题目
  • 思路
  • 代码

题目

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
在这里插入图片描述

思路

这道题让我们在原地旋转矩阵不能使用另外一个矩阵辅助旋转,那么如果我们去掉这个条件这道题有什么思路呢?很简单,这里我们设行是i,列是j,从图中我们可以发现在旋转之后原本的第一行变成了最后一列,第二行变成了倒数第二列。而其中的数字顺序是没有变化的所以我们可以得出一个公式
matrix[i][j]=matrix[j][n−i−1]matrix[i][j] = matrix[j][n-i-1] matrix[i][j]=matrix[j][ni1]
这个公式左边是原本的位置右边是旋转后的位置,在有了这个公式后每个位置的的旋转后位置就知道了所以我们只需要创建一个新的矩阵让matrix[j][n-i-1] = matrix[i][j]即可。
但是现在这道题需要我们原地旋转矩阵所以这个方法就没法用了,那么我们重新聚焦于这个公司,为什么得到这个公式后我们没法原地旋转这个矩阵呢因为我们会给右边那个位置的值给覆盖掉,想要避免这个情况我们可以定义一个temp来存储它的值,所以我们现在只要知道右边那个位置旋转之后的位置在哪就可以了,一样还是这个公式只不过我们是把它的行列当作一个整体来看就可以了
matrix[j][n−i−1]=matrix[n−i−1][n−j−1]matrix[j][n-i-1] = matrix[n-i-1][n-j-1] matrix[j][ni1]=matrix[ni1][nj1]
那么又回到了原来的问题,覆盖的位置的值还是用temp来保存那么它旋转后的位置在哪呢?一样用公式
matrix[n−i−1][n−j−i]=mtrix[n−j−1][i]matrix[n-i-1][n-j-i] = mtrix[n-j-1][i] matrix[ni1][nji]=mtrix[nj1][i]
继续还是一样的思路,再用公式
matrix[n−j−i][i]=matrix[i][j]matrix[n-j-i][i] = matrix[i][j] matrix[nji][i]=matrix[i][j]
我们发现转了一圈又回来了,所以这就是一个圈,四个位置形成一个圈。我们可以用temp存储matrix[i][j]的值然后一个一个的赋值。

那么既然是四个形成一圈我们是不是可以把整个矩阵分成四部分这样我们只需要遍历其中的一部分就可以完成整个旋转的操作了,所以问题又出现了这是一个n*n的矩阵我们要怎么分成四部分呢?分两种情况,n为偶数和n为奇数。
在这里插入图片描述

当n为偶数时分成四部分后一部分的数量就是n^2/4即(n/2)*(n/2)。

当n为奇数时我们要注意中间的位置是不会动的所以分成四部分后一部分的数量就是(n^2-1)/4,利用平方差公式和一些因式分解就可以得到最后的结果是(n-1)/2*(n+1)/2。

这两个情况一结合我们就可以发现我们需要遍历的行就是n/2,需要遍历的列是(n+1)/2。

代码

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 temp = matrix[i][j];matrix[i][j] = matrix[n - j - 1][i];matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];matrix[j][n - i - 1] = temp;}}}
};
http://www.dtcms.com/a/340484.html

相关文章:

  • [TryHackMe]Mr Robot CTF(hydra爆破+Wordpress更改主题)
  • IPSec安全概述
  • 医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(上)
  • 信创产品TongLinkQ安装及springboot2整合使用
  • AI 视频翻译工具的调研笔记
  • Spring Boot 实战:从项目搭建到部署优化
  • Causal-Copilot: An Autonomous Causal Analysis Agent 论文解读
  • 基于离散点集的三次样条插值与符号表达式构建:从 Scipy 到 Sympy 的完整实现
  • 记一次前端Vue3+Vite+TS项目中使用Mock.js + vite-plugin-mock插件发布到生产(线上)环境填坑汇总
  • 矩阵的特征分解
  • C语言---分隔符、常量、注释、标识符、关键字、空格
  • LoRa 网关组网方案(二)
  • 【科研绘图系列】R语言绘制平行坐标图
  • 保姆级Debezium抽取SQL Server同步kafka
  • 绕过 C 标准库限制执行系统命令:系统调用、Shellcode 和裸机二进制
  • week2-[一维数组]出现次数
  • css中的性能优化之content-visibility: auto
  • InfluxDB 查询性能优化实战(二)
  • 【解决方案】powershell自动连接夜神adb端口
  • 手撕线程池
  • AI 伦理的 “灰色地带”:当算法拥有决策权,公平与隐私该如何平衡?
  • C# NX二次开发:面收集器控件和曲线收集器控件详解
  • 边缘智能体:Go编译在医疗IoT设备端运行轻量AI模型(下)
  • DAY 51 复习日
  • Redis 复制功能是如何工作的
  • Android 开发问题:android:marginTop=“20px“ 属性不生效
  • 多系统 Node.js 环境自动化部署脚本:从 Ubuntu 到 CentOS,再到版本自由定制
  • 云原生俱乐部-k8s知识点归纳(5)
  • 自动化测试用例生成:基于Python的参数化测试框架设计与实现
  • MeterSphere断言操作