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

题目: 旋转图像

描述
给定一个 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]);
            }
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国经济增长:全球复苏的引擎

近年来&#xff0c;中国经济以其强劲的增长势头成为全球经济的重要引擎。中国的经济崛起不仅对自身国家发展具有重要意义&#xff0c;而且也对全球经济复苏和稳定有着积极影响。本文将从多个角度探讨中国经济增长对全球经济的影响及其作为全球复苏的引擎。 首先&#xff0c;中国…

《使用ThinkPHP6开发项目》 - ThinkPHP6使用JWT生成Token

《使用ThinkPHP6开发项目》 - 登录接口一-CSDN博客 《使用ThinkPHP6开发项目》 - 登录接口二-CSDN博客 《使用ThinkPHP6开发项目》 - 登录接口三【表单验证】-CSDN博客 登录接口成功后返回Token&#xff0c;便于其他需要验证用户登录的接口携带Token进行请求校验 这里Think…

基于ssm网络安全宣传网站设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网络安全宣传网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

SI24R03国产自主可控RISC-V架构MCU低功耗2.4GHz收发芯片SoC

目录 RISC-V架构的优势SI24R03/04特性射频收发器模块特征MCU 模块特征 其他特征 RISC-V架构的优势 相对于目前主流的英特尔X86架构及ARM等架构来说&#xff0c;RISC-V架构具有指令精简、模块化、可扩展、开源、免费等优点。RISC-V的基础指令集只有40多条&#xff0c;加上其他基…

爬虫的分类

爬虫的分类 网络爬虫按照系统结构和实现技术&#xff0c;大致可分为4类&#xff0c;即通用网络爬虫、聚焦网络爬虫、增量网络爬虫和深层次网络爬虫。 1.通用网络爬虫&#xff1a;搜索引擎的爬虫 比如用户在百度搜索引擎上检索对应关键词时&#xff0c;百度将对关键词进行分析…

比特币价格创新高:加密货币的崛起与未来

一、引言 近年来&#xff0c;比特币的价格一路上涨&#xff0c;引起了全球投资者和市场的广泛关注。作为最早一批区块链技术应用案例之一&#xff0c;比特币的成功带动了整个加密货币市场的兴起。本文将探讨比特币价格创新高的原因、加密货币的崛起以及未来发展趋势。 二、比特…

ChatGPT热门项目

1.智能GPT 项目地址&#xff1a;智能GPT&#xff1a;你只要提供OpenAI的API Key&#xff0c;那么它就可以根据你设定的目标&#xff0c;采用Google搜索、浏览网站、执行脚本等方式 主要语言&#xff1a;Python 推荐理由&#xff1a;这是由开发者Significant Gravitas推出的项目…

【C++练级之路】【Lv.4】类和对象(下)(初始化列表,友元,static成员,编译器的优化)

目录 一、再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 引入3.2 友元函数3.2.1 概念3.2.2 特性 3.3 友元类3.3.1 概念3.3.2 特性 四、内部类4.1 概念4.2 特性 五、匿名对象六、编译器的优化6.1 传参优化6.1.1 …

Java EE 网络之网络初识

文章目录 1. 网络发展史1.1 独立模式1.2 网络互连1.3 局域网 LAN1.4 广域网 WAN 2. 网络通信基础2.1 IP 地址2.2 端口号2.3 认识协议2.4 五元组2.5 协议分层2.5.1 什么是协议分层2.5.2 分层的作用2.5.3 OSI七层协议2.5.4 TCP/IP五层协议2.5.5 网络设备所在分层 2.6 分装和分用 …

简单的教务系统

#include <stdio.h> #include <string.h> #define N 20 int i,j,n,m,lll0,renshu6; double zcj[N]{0};struct stu{ char num[10]; //学号char name[10]; //姓名char sex; //姓别double score[3]; //3 门课的成绩double sum; //3 门课的总分double aver; //3 门课的…

【深度学习目标检测】五、基于深度学习的安全帽识别(python,目标检测)

深度学习目标检测方法则是利用深度神经网络模型进行目标检测&#xff0c;主要有以下几种&#xff1a; R-CNN系列&#xff1a;包括R-CNN、Fast R-CNN、Faster R-CNN等&#xff0c;通过候选区域法生成候选目标区域&#xff0c;然后使用卷积神经网络提取特征&#xff0c;并通过分类…

超聚变服务器(原华为服务器)网站模拟器

一、超聚变服务器&#xff08;原华为服务器&#xff09;网站模拟器&#xff1a; 原来了解服务器可以从他的网站上进行了解&#xff0c;模拟器做的很好了。 https://support.xfusion.com/server-simulators/ 有很多的模拟器&#xff0c;今天主要看下BMC的设置 有很多的在线工具…

vue中element-ui日期选择组件el-date-picker 清空所选时间,会将model绑定的值设置为null 问题 及 限制起止日期范围

一、问题 在Vue中使用Element UI的日期选择组件 <el-date-picker>&#xff0c;当你清空所选时间时&#xff0c;组件会将绑定的 v-model 值设置为 null。这是日期选择器的预设行为&#xff0c;它将清空所选日期后将其视为 null。但有时后端不允许日期传空。 因此&#xff…

生产实践:基于K8S的私有化部署解决方案

随着国内数字化转型的加速和国产化进程推动&#xff0c;软件系统的私有化部署已经成为非常热门的话题&#xff0c;因为私有化部署赋予了企业更大的灵活和控制权&#xff0c;使其可以根据自身需求和安全要求定制和管理软件系统。下面分享下我们的基于k8S私有化部署经验。 私有化…

AR眼镜光学方案_AR眼镜整机硬件定制

增强现实(Augmented Reality&#xff0c;AR)技术通过将计算机生成的虚拟物体或其他信息叠加到真实世界中&#xff0c;实现对现实的增强。AR眼镜作为实现AR技术的重要设备&#xff0c;具备虚实结合、实时交互的特点。为了实现透视效果&#xff0c;AR眼镜需要同时显示真实的外部世…

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

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

服务器上配置jupyter,提示Invalid credentials如何解决

我是按照网上教程在服务器上安装的jupyter以及进行的密码配置&#xff0c;我利用 passwd()这个口令生成的转译密码是"argon...."。按照教程配置jupyter notebook配置文件里面的内容&#xff0c;登陆网页提示"Invalid credentials"。我谷歌得到的解答是&…

如何学习Kubernetes,学习K8S入门教程

学习 Kubernetes&#xff08;K8s&#xff09;确实不容易 你的硬件资源有限时&#xff0c;不过别担心&#xff0c;我帮你理清思路&#xff0c;让你在学习 K8s 的路上更加从容。 1、资源限制下的学习方法 当硬件资源有限时&#xff0c;一个好的选择是使用云服务提供的免费层或者…

✺ch2——OpenGL图像管线

目录 基于C图形应用&#xff06;管线概览OpenGL类型第一个C/OpenGL应用程序◍API (1) GLSL类型着色器——画一个点的程序◍API (2)◍API (3) 栅格化像素操作——Z-buffer算法检测 OpenGL 和 GLSL 错误◍API (4) 从顶点来构建一个三角形场景动画◍API (5) OpenGL某些方面的数值—…

蓝牙物联网智慧物业解决方案

蓝牙物联网智慧物业解决方案是一种利用蓝牙技术来提高物业管理和服务效率的解决方案。它通过将蓝牙技术与其他智能设备、应用程序和云服务相结合&#xff0c;为物业管理和服务提供更便捷、高效和智能化的支持。 蓝牙物联网智慧物业解决方案包括&#xff1a; 1、设备管理&#…