LeetCode题练习与总结:旋转图像
一、题目描述
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 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]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
二、解题思路
1. 层次遍历:首先,我们可以观察到旋转操作实际上是将矩阵的每一层(从外到内)进行了交换。最外层的元素移动到了最底部,最底部的元素移动到了最右侧,最右侧的元素移动到了最顶部,最顶部的元素移动到了最左侧。因此,我们可以先对矩阵的最外层进行操作。
2. 保存最外层元素:在进行交换之前,我们需要保存最外层的元素,因为在旋转过程中,这些元素将被覆盖。
3. 交换元素:对于矩阵的每一层,我们需要将四个边界的元素进行交换。具体来说,对于每个元素位于最外层的 (i, j)
,我们执行以下操作:
- 保存
matrix[i][j]
的值。 - 将
matrix[j][n-1-i]
(最底部的元素)赋值给matrix[i][j]
。 - 将保存的值(原
matrix[i][j]
的值)赋值给matrix[n-1-i][n-1-j]
(最右侧的元素)。 - 以此类推,完成所有层次的旋转。
4. 逐层处理:从最外层开始,逐层向内处理,直到处理到矩阵的中心。
三、具体代码
class Solution {public void rotate(int[][] matrix) {int n = matrix.length; // 矩阵的大小 n x nint layers = n / 2; // 计算需要处理的层数for (int layer = 0; layer < layers; layer++) {int first = layer;int last = n - 1 - layer;for (int i = first; i < last; i++) {int offset = i - first;int top = matrix[first][i]; // 保存最上面的元素// 从左到右的元素依次交换matrix[first][i] = matrix[last - offset][first];matrix[last - offset][first] = matrix[last][last - offset];matrix[last][last - offset] = matrix[i][last];matrix[i][last] = top; // 恢复最上面的元素}}}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
- 该算法主要包含一个外层循环,它遍历了矩阵的层数,这个层数是
n/2
,其中n
是矩阵的大小。 - 对于每个层,我们进行了一个内层循环,这个循环遍历了每一层的元素。内层循环的次数是
(last - first)
,这个值随着层数的增加而减少,但总体上可以认为是n
。 - 因此,总的时间复杂度是
O(n)
,因为每个元素都被访问和修改了一次。
2. 空间复杂度
- 该算法没有使用任何额外的数据结构来存储矩阵的元素,所有的操作都是在原地进行的。
- 我们只使用了少量的变量来保存在交换过程中需要临时存储的值。
- 因此,空间复杂度是
O(1)
,表示算法使用的空间量不随输入数据的大小而变化。
五、总结知识点
-
二维数组(矩阵)操作:代码处理的是一个二维数组(矩阵),这是算法设计中常见的数据结构。在 Java 中,二维数组可以看作是数组的数组。
-
循环结构:代码使用了嵌套的
for
循环来遍历矩阵的元素。外层循环用于控制旋转的层次,内层循环用于在每一层中进行元素的交换。 -
原地算法(In-place Algorithm):这个算法在不使用额外空间的情况下,直接在输入的矩阵上进行操作,即原地旋转。这是优化算法空间复杂度的一种常用方法。
-
边界处理:在旋转矩阵时,只有最外层的元素需要交换。因此,代码通过计算层数
layers
来确定需要处理的边界。 -
临时变量:在交换元素时,使用临时变量
top
来保存被覆盖的值,这是在进行元素交换时常见的技巧,以避免信息丢失。 -
数学计算:代码中的
offset
变量用于计算当前元素在旋转后的新位置。这涉及到对矩阵索引的数学计算。 -
条件判断:在内层循环中,
i
和first
的差值offset
被用来确定元素在旋转后的新位置,这是基于矩阵的对称性质。 -
旋转操作:顺时针旋转 90 度的操作,实际上是对矩阵的四个边界进行元素交换,这是一种典型的矩阵旋转操作。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。
相关文章:

LeetCode题练习与总结:旋转图像
一、题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],…...

如何在家中使用手机平板电脑 公司iStoreOS软路由实现远程桌面
文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是:** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能,也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处:…...

【文献分享】myMUSCLE, a New Multiphysics, Multiscale Simulation Coupling Environment
题目:myMUSCLE, a New Multiphysics, Multiscale Simulation Coupling Environment 链接: https://doi.org/10.1080/00295639.2022.2148809 myMUSCLE,一种新的多物理场、多尺度仿真耦合环境 摘要 计算能力的提高使核界能够结合有关反应…...

2024年云计算使用报告,89%组织用多云,25%广泛使用生成式AI,45%需要跨云数据集成,节省成本是云首要因素
备注:本文来自Flexera2024年的云现状调研报告的翻译。原报告地址: https://info.flexera.com/CM-REPORT-State-of-the-Cloud Flexera是一家专注于做SaaS的IT解决方案公司,有30年发展历史,5万名客户,1300名员工。Flex…...

【Python操作基础】——序列
🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享 擅长Python、Matlab、R等主流编程软件 累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…...

Vue 与 React:前端框架对比分析
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

解决kubesphere流水线docker登陆错误http: server gave HTTP response to HTTPS client
kubesphere DevOps流水线中,在登录私有的harbor仓库时,报以下错误 docker login 111.230.19.120:80 -u admin -p test123. WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from daemon: Get "https://…...

macOS安装mongoDB(homebrew)
使用 Homebrew Homebrew 是 macOS 的一个包管理器,可以非常方便地安装 MongoDB 和其他软件。如果你还没有安装 Homebrew,可以从它的官网上找到安装指令。 已安装 Homebrew的话,先更新一下homebrew brew update 你可以使用下面的命令来安装…...

免费SSL证书和付费SSL证书的区别点
背景: 在了解免费SSL证书和付费SSL证书的区别之前,先带大家了解一下SSL证书的概念和作用。 SSL证书的概念: SSL证书就是基于http超文本传输协议的延伸,在http访问的基础上增加了一个文本传输加密的协议,由于http是明…...

【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)
题目描述 leetcode题目:1633. 各赛事的用户注册率 Code select contest_id, round(count(*)/(select count(*) from Users)*100, 2) as percentage from Register group by contest_id order by percentage desc, contest_id ascCOUNT()函数 COUNT函数用法&#…...

【LVGL-使用SquareLine Studio设计器 】
LVGL-使用SquareLine Studio设计器 ■ 简介■ 安装■ SquareLine Studio移植到工程 ■ 简介 SquareLine Studio 设计器是一个付费软件。 ■ 安装 SquareLine Studio 设计器的下载地址 我们点击“WINDOWS”下载 SquareLine Studio 设计器,下载完成之后我们就会得到…...

将二进制数a的每一位右移b位operator.rshift(a,b)
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将二进制数a的 每一位右移b位 operator.rshift(a,b) [太阳]选择题 请问执行operator.rshift(4, 1)的结果为? import operator print("【显示】二进制2:",bi…...

M芯片 mac配置Vulkan环境报错 Xcode
报错: Ignoring file ‘/usr/local/Cellar/glfw/3.3.4/lib/libglfw.3.3.dylib’: found architecture ‘x86_64’, required architecture ‘arm64’ Undefined symbols: Linker command failed with exit code 1 (use -v to see invocation) 解决:重新安…...

Day23:事务管理、显示评论、添加评论
事务管理 事务的定义 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的最小执行体(事务中部分执行失败就会回滚 。一致性(C…...
第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》
第一篇:概述、目录、适用范围及术语 - IAB与MRC及《增强现实广告效果测量指南1.0》 --- 我为什么要翻译美国IAB科技公司系列标准 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效…...

pytorch常用的模块函数汇总(2)
目录 torch.utils.data:数据加载和处理模块,包括 Dataset 和 DataLoader 等工具,用于加载和处理训练数据。 torchvision:计算机视觉模块,提供了图像数据集、转换函数、预训练模型等,用于计算机视觉任务。 …...

OpenAI奥特曼豪赌1.42亿破解长生不老
生物初创公司 Retro Biosciences 由山姆奥特曼投资1.42亿英镑,公司目标是延长人类寿命。 山姆奥特曼投资背景: 38 岁的奥特曼一直是科技行业的重要参与者。尽管年纪轻轻,奥特曼凭借 ChatGPT 和 Sora 等产品席卷了科技领域。奥特曼对 Reddit…...

[晕事]今天做了件晕事29;iptables
今天办了一件晕事,主机之间做ping用tcpdump抓到了ping request,但是没有看到ping reply,查看主机的arp表,路由表都没有问题,忘记看iptables的规则。虽然在tcpdump看到包,只是代表包到了二层,并不…...

2018年亚马逊云科技推出基于Arm的定制芯片实例
2018年,亚马逊云技术推出了基于Arm的定制芯片。 据相关数据显示,基于Arm的性价比比基于x86的同类实例高出40%。 这打破了对 x86 的依赖,开创了架构的新时代,现在能够支持多种配置的密集计算任务。 这些举措为亚马逊云技术的其他创…...

用搜索引擎收集信息-常用方式
1,site csdn.net (下图表示只在csdn网站里搜索java) 2,filetype:pdf (表示只检索某pdf文件类型) 表示在浏览器里面查找有关java的pdf文件 3,intitle:花花 (表示搜索网页标题里面有花…...

Adobe推出20多个,企业版生成式AI定制、微调服务
3月27日,全球多媒体领导者Adobe在拉斯维加斯召开“Summit 2024”大会,重磅推出了Firefly Services。 Firefly Services提供了20 多个生成式AI和创意API服务,支持企业自有数据对模型进行定制、微调,同时可以与PS、Illustrator、Ex…...

叁[3],NavigationDrawerViewsActivity新增Fragment
1,环境 AndriodStudio JDK21 2,新建项目NavigationDrawerViewsActivity 3,新建包文件夹,ui右键菜单/New/Package 4,新建Fragment,app右键菜单/New/Fragment/Fragment(with ViewModel) 5,资源string增加键…...

备考ICA----Istio实验7---故障注入 Fault Injection 实验
备考ICA----Istio实验7—故障注入 Fault Injection 实验 Istio 的故障注入用于模拟应用程序中的故障现象,以测试应用程序的故障恢复能力。故障注入有两种: 1.delay延迟注入 2.abort中止注入 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/…...

[flask]异常抛出和捕获异常
Python学习之Flask全局异常处理流程_flask 异常处理-CSDN博客 读取文件错误 OSError: [Errno 22] Invalid argument:_[errno 22] invalid argument: ..\\data\\snli_1.0\\-CSDN博客 异常触发 assert触发异常: 在Python中,使用assert语句可以检查某个条…...

js逆向之实例某宝热卖(MD5)爬虫
目录 正常写 反爬 逆向分析 关键字搜索 打断点&分析代码 得出 sign 的由来 确定加密方式 写加密函数了 补全代码 免责声明:本文仅供技术交流学习,请勿用于其它违法行为. 正常写 还是老规矩,正常写代码,该带的都带上,我这种方法发现数据格式不完整. 应该后面也是大…...

7、jenkins项目构建细节-常用的构建触发器
文章目录 一、常用的构建细节1、触发远程构建2、其他工程构建后触发3、定时构建4、轮询SCM(Poll SCM)二、Git hook自动触发构建(☆☆☆)1、安装插件2、Jenkins设置自动构建3、Gitlab配置webhook三、Jenkins的参数化构建1、项目创建分支,并推送到gitlab上2、在Jenkins添加字…...

【前端学习——css篇】4.px和rem的区别
https://github.com/febobo/web-interview 4.px和rem的区别 ①px px,表示像素,所谓像素就是呈现在我们显示器上的一个个小点,每个像素点都是大小等同的,所以像素为计量单位被分在了绝对长度单位中 有些人会把px认为是相对长度&…...

深入解析Oracle数据库中的标量子查询(Scalar Subquery)及其等价改写方法
在Oracle数据库中,标量子查询(Scalar Subquery)是一种特殊的子查询,它返回单个值作为结果,而不是一组记录。标量子查询通常嵌套在另一个查询的SELECT列表、WHERE子句、HAVING子句或表达式中,它就像一个可以…...

Pytorch多机多卡分布式训练
多机多卡分布式: 多机基本上和单机多卡差不多: 第一台机器(主设备): torchrun --master_port 6666 --nproc_per_node8 --nnodes${nnodes} --node_rank0 --master_addr${master_addr} train_with_multi_machine_an…...

win11 环境配置 之 Jmeter
一、安装 JDK 1. 安装 jdk 截至当前最新时间: 2024.3.27 jdk最新的版本 是 官网下载地址: https://www.oracle.com/java/technologies/downloads/ 建议下载 jdk17 另存为到该电脑的 D 盘下,新建jdk文件夹 开始安装到 jdk 文件夹下 2. 配…...