LeetCode HOT 100 —— 48.旋转图像

news2025/1/19 23:15:20

题目

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

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

思路

方法一:使用辅助数组

可以得出规律,将图像旋转90度后,原来矩阵的第一行,相应的出现在了倒数第一列的位置,并且第一行的x元素在旋转后正好是倒数一列的第x个元素,第 i 行也是类似…

可以得出规律:

对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。

用代码表示就是(注意矩阵的行列从0开始计算):
matrix[row][col]在旋转之后的新位置为matrix[col][n - row - 1]

然后用一个和matrix大小相同的辅助数组,临时存储旋转后的数组,遍历原矩阵matrix的每一个元素存到辅助数组中,然后把结果复制到原矩阵中即可

java代码如下:

class Solution {
	public void rotate(int[][] matrix){
		int n = matrix.length;
		int[][] matrix_new = new int[n][n]; 
		for(int i = 0; i < n ; i++){
			for(int j = 0; j < n; j++){
				matrix_new[j][n - i - 1] = matrix[i][j];
			}
		}
		for(int i = 0; i < n; i++){
			for(int j = 0; j < n; j++){
				matrix[i][j] = matrix_new[i][j];
			}
		}
	}
}

时间复杂度:O(n^2)
空间复杂度:O(n^2),严格来说不算原地旋转,因为不是O(1)的空间复杂度

方法二:原地旋转

其实可以在方法一的基础上进行优化

注意到,matrix[col][n - row - 1] = matrix[row][col],这里不能进行原地旋转的原因是,如果直接将原数组的值matrix[row][col]赋给原数组的matrix[col][n - row - 1]的位置,那么原数组的matrix[col][n - row - 1]值就会被覆盖掉,所以这里可以采用一个临时变量temp来暂存matrix[col][n - row - 1]的值,可以保证即使被覆盖了,仍然能找回matrix[col][n - row - 1]的值
即:

temp = matrix[col][n - row - 1];
matrix[col][n - row - 1] = matrix[row][col];

这里需要继续去判断matrix[col][n - row - 1]旋转后到了哪个位置,以此类推:
这四项处于一个循环之中,每一项旋转后的位置就是下一项所在的位置,即用一个临时变量完成这四项的原地交换即可

matrix[row][col]
matrix[col][n−row−1]
matrix[n−row−1][n−col−1]
matrix[n−col−1][row]

知道了如何原地旋转矩阵之外,还需要枚举哪些位置(即循环多少次)

  • 对于n为偶数时,需要枚举n^2/4=(n/2)×(n/2)个位置
  • 对于n为奇数时,由于中心的位置经过旋转后位置不变,需要枚举 (n^2-1)/4 = (n-1)/2 * (n+1)/2个位置
    两者选最大的,分别为n/2和(n+1)/2
    替换过程如下图所示(以奇数边为例):
    在这里插入图片描述
    java代码如下:
class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        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;
            }
        }
    }
}

时间复杂度:O(n^2)
空间复杂度:O(1),原地旋转

方法三:用翻转代替旋转

先通过上下翻转,再主对角线翻转(注意哈,主对角线是↘,副对角线是↗)

推导过程:

  • 对于上下翻转,只需要将矩阵上面元素和矩阵下面元素进行交换,即matrix[row][col] —>水平轴翻转—>matrix[n−row−1][col]
  • 对于主对角线翻转,只需要枚举对角线左下侧的元素,和右上侧的元素进行交换,即matrix[row][col] —>主对角线翻转—>matrix[col][row]

联立二式可得:matrix[row][col]—>水平轴翻转—>matrix[n−row−1][col]—>主对角线翻转—>matrix[col][n - row - 1]

和方法一、二中的等式一样:matrix[col][n−row−1]=matrix[row][col]

java代码如下:

class Solution{
	public void rotate(int[][] matrix){
		int n = matrix.length;
		//上下翻转
		for(int i = 0; i < n / 2; i++){//行只需要遍历到一半即可
			for(int j = 0; j < n; j++){
				int temp = matrix[i][j];
				matrix[i][j] = matrix[n - i - 1][j];
				matrix[n - i - 1][j] = temp;
			}
		}
		//主对角线↘翻转
		for(int i = 0; i < n; i++){
			for(int j = 0; j < i; j++){
				int temp = matrix[i][j];
				matrix[i][j] = matrix[j][i];
				matrix[j][i] = temp;
			}
		}
	}
}

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

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

相关文章

集合框架----源码解读HashMap篇(一)

1.HashMap官方介绍 基于哈希表的Map接口实现。该实现提供了所有可选的映射操作&#xff0c;并允许空值和空键。(HashMap类大致相当于Hashtable&#xff0c;除了它是非同步的&#xff0c;并且允许为空值。)这个类不保证映射的顺序;特别是&#xff0c;它不能保证顺序随时间的推移…

Nodejs -- Express托管静态资源

文章目录托管静态资源1 expess.static()2 托管多个静态资源目录3 挂载路径前缀托管静态资源 1 expess.static() express提供了一个非常好用的函数&#xff0c;叫做express.static()&#xff0c;通过它&#xff0c;我们可以非常方便地创建一个静态资源服务器&#xff0c;例如&…

PG::FunboxEasyEnum

nmap -Pn -p- -T4 --min-rate1000 192.168.81.132 nmap -Pn -p 22,80 -sCV 192.168.81.132 80端口是Apache2 Ubuntu的默认页面 尝试路径爆破 /mini.php可以进行文件上传 直接上传reverse-php-shell 上传linpeas脚本进行枚举&#xff0c;得到oracle用户的密码hash oracle…

2022-11-28-大数据可视化“可视化国产/进口电影票房榜单”分析,特征维度大于50

可视化国产/进口电影票房榜单前言数据分析数据可视化过程分析总结前言 党的十八大以来&#xff0c;国产电影产业与事业快速发展&#xff0c;创作水平不断提高&#xff0c;题材类型丰富多元&#xff0c;受众口碑不断提升&#xff0c;在市场竞争中表现愈发突出&#xff0c;已成为…

《论文阅读》BA-NET: DENSE BUNDLE ADJUSTMENT NETWORKS

留个笔记自用 BA-NET: DENSE BUNDLE ADJUSTMENT NETWORKS 做什么 首先是最基础的&#xff0c;Structure-from-Motion&#xff08;SFM&#xff09;&#xff0c;SFM可以简单翻译成运动估计&#xff0c;是一种基于dui8序列图片进行三维重建的算法。简单来说就是是从运动中不同角…

【Python】记录从3.9升级到3.11踩的坑

写在前面的话&#xff1a;如果想体验python3.11&#xff0c;不推荐生产环境升级&#xff0c;可以现在测试环境试试看 环境变化 原始环境 Python3.9&#xff0c;有挺多安装的第三方库&#xff0c;有自己写的类和方法&#xff0c;程序一切运行正常 升级环境 Python3.11&#…

如何获取Adreno GPU数据

什么是GPU GPU&#xff08;Graphic Processing Unit&#xff09;是图形处理器&#xff0c;相当于在计算机和移动终端上做图形图像运算工作的微处理器&#xff0c;显示芯片。通过向量计算和并行计算等方式加速了原有的计算工作&#xff0c;能够更好地处理几何转换和光照计算等&a…

如何与意法半导体STMicro建立EDI连接?

项目背景 意法半导体STMicro是全球最大的半导体公司之一&#xff0c;2010 年净收入 103.5 亿美元&#xff0c;2011 年第二季度净收入 25.7亿美元。 以业内最广泛的产品组合著称&#xff0c;凭借多元化的技术、尖端的设计能力、知识产权组合、合作伙伴战略和高效的制造能力&…

pdf怎么编辑?分享两款pdf编辑软件,编辑pdf也很简单!

pdf怎么编辑&#xff1f;其实也很简单&#xff0c;现在跟大家分享两款pdf编辑软件&#xff0c;可以让我们对pdf实现自由编辑修改&#xff0c;有了这两款pdf编辑软件&#xff0c;编辑pdf将不再困难。 pdf编辑软件一&#xff1a;万兴pdf编辑软件 万兴pdf是一款受众广泛&#xff0…

【设计】OOA、OOD、OOP

这三者都是 OO&#xff08;Object-Oriented&#xff09;领域的思想。 一般我们我们接到产品经理的需求后&#xff0c;开发阶段分这样几个步骤&#xff1a; 可行性预研阶段&#xff0c;此阶段评估需求是否合理&#xff0c;能否实现&#xff1b;OOA阶段&#xff0c;此阶段分析用…

【Lilishop商城】No2-5.确定软件架构搭建四(本篇包括消息中间件RocketMQ)

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇只介绍重点架构逻辑&#xff0c;具体编写看源代码就行&#xff0c;读起来也不复杂~ 谨慎&#xff…

Python:如何在 CentOS 8 服务器上运行 Selenium 代码?

前言 因项目需求&#xff0c;需要在 CentOS 8 服务器上运行 Python-Selenium 代码&#xff0c;那么该如何操作呢&#xff1f; 运行环境 CentOS Stream 8Python 3.9.13selenium4.6.0Google Chrome 107.0.5304.121 操作步骤 安装 Google Chrome 下载 Linux 版本的 Chrome 将下…

怎么合并视频?快把这些方法收好

小伙伴们平时会在通过网课来提高自己的技能吗&#xff1f;我经常会在网上保存一系列的视频进行学习&#xff0c;可是当保存的网课视频数量多起来后&#xff0c;每次想要找对应的视频&#xff0c;都得花上不少的时间。其实我们可以通过将相同系列的视频合并起来的方法&#xff0…

java word,excel,ppt转pdf

准备工作 1.下载 jacob.jar 链接&#xff1a;https://pan.baidu.com/s/1TWIGyX9A3xQ6AG9Y3mVlVg 提取码&#xff1a;abcd 2.下载安装wpsWPS Office-支持多人在线编辑多种文档格式_WPS官方网站 3.添加 jar到项目和ddl文件放在jdk的jre/bin目录下&#xff0c;记得自己系统是…

13_cgi

知识点1【cgi实现计算器案例】 2、GET的同步方式&#xff1a; index.html <html><head><title>table</title><meta charset"UTF-8"><!--这是描述 js中的函数来之哪个js文件--><script type"text/javascript" sr…

Kafka基础与核心概念

本文&#xff0c;我们将试图回答什么是apache kafka。 kafka是一个分布式流平台或者分布式消息提交日志 分布式 Kafka 由一个或多个节点组成的工作集群&#xff0c;这些节点可以位于不同的数据中心&#xff0c;我们可以在 Kafka 集群的不同节点之间分布数据/负载&#xff0c;并…

【学习笔记47】开关变量和拖拽效果

一、开关案例 <button>点击获取验证码</button>&#xff08;一&#xff09;基本功能的实现 // 获取标签对象const oBtn document.querySelector(button);// 给按钮添加点击事件oBtn.addEventListener(click, function () {// 定义变量 用于获取验证码let count 5…

javaSE- 方法的使用

一、方法的基本用法 方法就是一个代码片段. 类似于 C 语言中的 “函数”. 方法存在的意义(不要背, 重在体会): 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置使用.让代码更好理解更简单.直接调用现有方法开发, 不必重复造轮…

04_SpringBoot整合Mybatis

文章目录SpringBoot整合Mybatis0x01_创建项目导入依赖0x02_编写配置文件0x03_编写功能代码SpringBoot整合Mybatis 欢迎关注公众号“小东方不败” 0x01_创建项目导入依赖 创建项目&#xff1a; 目前稳定的最新版本是2.7.5,勾选两个依赖&#xff1a;Lombok和Spring Web 然后需…

Nodejs -- Express 路由原理及设置模块化路由

文章目录1. 路由的概念1.1 什么是路由1.2 显示生活中的路由1.3 Express中的路由1.4 Express中路由的例子1.5 路由的匹配过程2 路由的使用2.1 最简单的用法2.2 模块化路由2.3 为路由模块添加统一前缀1. 路由的概念 1.1 什么是路由 广义上来讲&#xff0c;路由就是映射关系 1.…