leetcode面试经典150题——36 旋转图像

news2024/9/23 21:31:06

题目: 旋转图像

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

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:在这里插入图片描述
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
leetcode链接

方法一:(使用额外数组)
我们通过把矩阵顺时针旋转90度,可以发现, 第一行的元素到了倒数第一列,第二行的元素到了倒数第二列,以此类推,第i行的元素,变到了n-i-1(i从0开始)列,相同的第一列的元素变到了第一行,…第j列的元素变到了第j行,因此对于i行j列的元素,旋转后的位置应该为第j行n-i-1列,因此我们定义一个相同大小的矩阵,遍历原矩阵的每个元素,存储至新矩阵旋转后的位置上。
由于原题要求原地旋转图像,则不能申请新的内存空间,所以此方法不可行
时间复杂度:o(n²)
空间复杂度:o(n²)

void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        auto new_matrix = matrix;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                //i行j列元素变到j行n-i-1列
                new_matrix[j][n-i-1] = matrix[i][j];
            }
        }
        matrix = new_matrix;
    }

方法二:找规律
由方法一可知:对于matrix[i][j],旋转后的新位置为matrix[j][n-i-1],matrix[j][n-i-1]旋转后的位置为matrix[n-i-1][n-j-1],matrix[n-i-1][n-j-1]旋转后的位置为matrix[n-j-1][i],matrix[n-j-1][i]旋转后的位置为matrix[i][j],此时我们惊讶的发现对于一个元素旋转四次后会恢复到原点,很好理解,一个n阶矩阵每次旋转90度,旋转360度后会回到原位置。
知道上述规律后,我们不再定义一个新的矩阵,而是定义一个temp变量,记录最开始的matrix[i][j],而最后第四个元素旋转后的元素就应该是temp。现在我们把一个矩阵平分为4块,当n为奇数时中间剩一块,中间剩下的那一块旋转后不变。因此我们只需要对其中任意一块,对它进行旋转4次,即可得到答案。如下图所示
时间复杂度:o(n²)
空间复杂度:o(1)

在这里插入图片描述
在这里插入图片描述

void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int temp;
        for(int i = 0;i<n/2;i++){
            for(int j = 0;j<(n+1)/2;j++){
                temp = matrix[i][j];
                matrix[i][j] = matrix[n-j-1][i];//matrix[i][j]位置为matrix[n-j-1][i]旋转而来
                matrix[n-j-1][i] = matrix[n-i-1][n-j-1];//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[n-i-1][n-j-1]位置由matrix[j][n-i-1]旋转而来
                matrix[j][n-i-1] = temp;//matrix[j][n-i-1]位置由matrix[i][j]旋转而来,即为temp
            }
        }
    }

方法三:用翻转代替旋转
通过方法一可知我们matrix[i][j]旋转后的位置为matrix[j][n-i-1],但是如果直接让matrix[j][n-i-1] = matrix[i][j],会丢失matrix[j][n-i-1]的值,导致后面旋转matrix[j][n-i-1]时候发生错误,因此我们不考虑让一个一个元素变到对应的位置,我们考虑让所有元素一起变到对应的位置。
从以上思路可得,我们想要把matrix[i][j]变到matrix[j][n-i-1],需要分两步:
1.把matrix[i][j]变到matrix[j][i]
2.把matrix[j][i]变到matrix[j][n-i-1]
或者是:
1.把matrix[i][j]变到matrix[n-i-1][j]
2.把matrix[n-i-1][j]变到matrix[j][n-i-1]
我们考虑第一种方案,我们如何实现1呢,可知我们对把矩阵的所有元素对主对角线对称,可以实现把matrix[j][i] = matrix[i][j]
然后我们把每一行元素翻转,即可得到matrix[j][n-i-1] = matrix[i][j],最终可实现matrix[i][j]变到matrix[j][n-i-1],而不会覆盖元素,因为我们把原问题分解成了2个子问题。
时间复杂度:o(n²)
空间复杂度:o(1)

void rotate(vector<vector<int>>& matrix) {
       int n = matrix.size();
       int temp;
       //第一步,将原矩阵关于主对角线翻转
       for(int i=0;i<n;i++){
           for(int j=0;j<i;j++){
               swap(matrix[i][j],matrix[j][i]);
           }
       }
        //第二步,将原矩阵每一列翻转
        for(int i=0;i<n;i++){
            for(int j=0;j<n/2;j++){
                swap(matrix[i][j],matrix[i][n-j-1]);
            }
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1311198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】LoRA: Low-Rank Adaptation of Large Language Models

code&#xff1a;GitHub - microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Models" 做法&#xff1a; 把预训练LLMs里面的参数权重给冻结&#xff1b;向transformer架构中的每一层&#xff0c;注入可训练的…

MYSQL练题笔记-子查询-换座位

一、题目相关内容 1&#xff09;相关的表和题目 2&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 没啥思路&#xff0c;我还没做过交换的这种题&#xff0c;所以我觉得这类交换的题以后值得做一个合集&#xff0c;是有点灵活度在里面的&a…

智能优化算法应用:基于黄金正弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黄金正弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黄金正弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黄金正弦算法4.实验参数设定5.算法结果6.…

【Proteus仿真】【51单片机】视力保护仪

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使LCD1602液晶&#xff0c;按键、HC-SR04超声波、PCF8591 ADC、光敏传感器、蜂鸣器、LED等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示…

云计算:Vmware 安装 FusionCompute

目录 一、理论 1.FusionCompute 二、实验 1.Vmware 安装 FusionCompute&#xff08;CNA&#xff09; 2.Vmware 安装 FusionCompute&#xff08;VRM&#xff09; 三、问题 1. VRM-WEB登录失败 2.Windows cmd中无法ping通虚拟机 一、理论 1.FusionCompute &#xff08;…

【C语言】操作符详解(四):结构成员访问操作符

结构成员访问操作符 结构体 ⭐C语言已经提供了内置类型&#xff0c;如: char、short、int、long、float、double等&#xff0c;但是只有这些内置类型还是不够的&#xff0c;假设我想描述学生&#xff0c;描述一本书&#xff0c;这时单一的内置类型是不行的。描述一个学生需要名…

Android VpnService 使用(一)

Android VpnService 使用(一) 本篇算是VpnService 使用的第一篇文章,主要讲述service创建,intent调用. 1: 申请权限 <service android:name".MyVpnService" android:permission"android.permission.BIND_VPN_SERVICE"><intent-filter><ac…

如何将xlsx中的数据通过datagrep导入到mysql数据库表中

在将xlsx数据通过datagrep导入到mysql数据库表中之前需要将xlsx数据导出为csv结尾的格式&#xff0c;因为如果不以csv格式导入会出现乱码。 详细步骤 1、是导入到数据库中没有表 找到对应的数据库&#xff0c;右键点击 选择需要导入的文件&#xff0c;注意一定要选择csv格式…

国家开放大学 湖南开放大学形成性考核 平时作业 统一资料

试卷代号&#xff1a;1258 房屋建筑混凝土结构设计 参考试题 一、单项选择题&#xff08;每小题2分&#xff0c;共计40分&#xff09; 1.( )是将框架结构中的部分跨间布置剪力墙或把剪力墙结构的部分剪力墙抽掉改为框架承重。 A.梁板结构体系 B.框…

Android开发的技术与开发流程

目录 引言 1. Android开发环境搭建 1. 安装Java Development Kit&#xff08;JDK&#xff09; 2. 安装Android Studio 3. 配置虚拟设备&#xff08;可选&#xff09; 4. 创建你的第一个Android项目 5. 连接实体设备&#xff08;可选&#xff09; 2. Android基础知识 1…

CSS第二天导读

1&#xff0c;Emmet语法 Emmet语法的前身是Zen coding&#xff0c;它使用缩写&#xff0c;来提高html / css 的编写速度&#xff0c;Vscode内部已经集成该语法 1.1&#xff0c;快速生成HTML结构语法 1.想要快速生成多个相同标签&#xff0c;加上*就可以了&#xff0c;比如 d…

ChatGLM大模型推理加速之Speculative Decoding

目录 一、推测解码speculative decoding 1、自回归解码 2、speculative decoding 3、细节理解 二、核心逻辑代码 1、算法流程代码 2、模型自回归代码 a、带缓存的模型自回归实现代码 b、优化版本带缓存的模型自回归实现代码 c、ChatGLM的past_key_values的回滚 三、…

前端已死?别低估前端,他是互联网世界的核心!【这是一篇治愈系文章】

文章目录 &#x1f4a5; AI回答&#x1f98b; 现状&#x1f989; 焦虑&#x1f409; 力量&#x1f985; 观点&#x1f423; 粗浅分析&#x1f9a5; 快乐的韭菜&#x1f3c6; 总结 &#x1f4a5; AI回答 前端已死&#xff1f; ai的答案是这样: 前端并没有死掉&#xff0c;它仍然…

【论文阅读】O’Reach: Even Faster Reachability in Large Graphs

Hanauer K, Schulz C, Trummer J. O’reach: Even faster reachability in large graphs[J]. ACM Journal of Experimental Algorithmics, 2022, 27: 1-27. Abstract 计算机科学中最基本的问题之一是可达性问题&#xff1a;给定一个有向图和两个顶点s和t&#xff0c;s可以通过…

python socket编程8 - PyQt6界面实现TCP server/client 多客户端通讯的例子

一、小总结&#xff1a; 首先&#xff0c;在 《python socket编程5 - 最简单的命令行启动的tcp/udp server/client例子》 中实现了最简单的TCP/UDP server和client在命令行下可执行的代码。 然后&#xff0c;分别在《python socket编程6 - 使用PyQt6 开发UI界面实现TCP server…

[c++] 意识需要转变的一个例子,全局变量的构造函数先于main执行

最近还遇到一个例子是关于&#xff1a;从C转C开发需要注意的一个意识问题。本人遇到的这个问题是&#xff0c;带着C的意识来看C的代码&#xff0c;然后根据代码看&#xff0c;有一个全局变量的值在main函数进入之后才会更改&#xff0c;所以百思不得其解&#xff0c;这个变量怎…

(反序列化)小记录

目录 [CISCN 2023 华北]ez_date 绕过MD5和sha1强相关绕过 date()绕过 payload [FSCTF 2023]ez_php [CISCN 2023 华北]ez_date <?php error_reporting(0); highlight_file(__FILE__); class date{public $a;public $b;public $file;public function __wakeup(){if(is_a…

【WebRTC】用WebRTC做即时视频聊天应用

【配套项目源码】 打开即用,设置一个免费的Agora账户就可以实现视频电话。非常好的WebRTC学习和应用项目。 用VSCode打开即可。 https://download.csdn.net/download/weixin_41697242/88630069 【什么是WebRTC?】 WebRTC是一套基于JS的API,能够建立端对端的直接通信,实…

Oracle(2-15)RMAN Incomplete Recovery

文章目录 一、基础知识1、The Procedure 不完全恢复步骤2、UNTIL TIME Example 基于时间的恢复3、UNTIL SEOUENCE Example 基于序列的恢复4、什么是RMAN的不完全恢复 二、基础操作1、不完全恢复准备工作2、不完全恢复开始恢复 RMAN Incomplete Recovery RMAN的不完全恢复 目标&…

【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

上篇文章中我们引入了算法、数据结构、数据类型等概念&#xff0c;而要想衡量一个算法与数据结构是否为优质的&#xff0c;就需要一个衡量标准&#xff0c;这个衡量标准也是在我们实现一个好的算法时要遵循的原则。 目录 基本概念渐进性态渐进性态数学表征算法复杂度的运算顺序…