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

LeetCode题练习与总结:旋转图像

一、题目描述

给定一个 × 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),表示算法使用的空间量不随输入数据的大小而变化。

五、总结知识点

  1. 二维数组(矩阵)操作:代码处理的是一个二维数组(矩阵),这是算法设计中常见的数据结构。在 Java 中,二维数组可以看作是数组的数组。

  2. 循环结构:代码使用了嵌套的 for 循环来遍历矩阵的元素。外层循环用于控制旋转的层次,内层循环用于在每一层中进行元素的交换。

  3. 原地算法(In-place Algorithm):这个算法在不使用额外空间的情况下,直接在输入的矩阵上进行操作,即原地旋转。这是优化算法空间复杂度的一种常用方法。

  4. 边界处理:在旋转矩阵时,只有最外层的元素需要交换。因此,代码通过计算层数 layers 来确定需要处理的边界。

  5. 临时变量:在交换元素时,使用临时变量 top 来保存被覆盖的值,这是在进行元素交换时常见的技巧,以避免信息丢失。

  6. 数学计算:代码中的 offset 变量用于计算当前元素在旋转后的新位置。这涉及到对矩阵索引的数学计算。

  7. 条件判断:在内层循环中,ifirst 的差值 offset 被用来确定元素在旋转后的新位置,这是基于矩阵的对称性质。

  8. 旋转操作:顺时针旋转 90 度的操作,实际上是对矩阵的四个边界进行元素交换,这是一种典型的矩阵旋转操作。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关文章:

LeetCode题练习与总结:旋转图像

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

如何在家中使用手机平板电脑 公司iStoreOS软路由实现远程桌面

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

【文献分享】myMUSCLE, a New Multiphysics, Multiscale Simulation Coupling Environment

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

2024年云计算使用报告,89%组织用多云,25%广泛使用生成式AI,45%需要跨云数据集成,节省成本是云首要因素

备注&#xff1a;本文来自Flexera2024年的云现状调研报告的翻译。原报告地址&#xff1a; https://info.flexera.com/CM-REPORT-State-of-the-Cloud Flexera是一家专注于做SaaS的IT解决方案公司&#xff0c;有30年发展历史&#xff0c;5万名客户&#xff0c;1300名员工。Flex…...

【Python操作基础】——序列

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…...

Vue 与 React:前端框架对比分析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

解决kubesphere流水线docker登陆错误http: server gave HTTP response to HTTPS client

kubesphere DevOps流水线中&#xff0c;在登录私有的harbor仓库时&#xff0c;报以下错误 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 的一个包管理器&#xff0c;可以非常方便地安装 MongoDB 和其他软件。如果你还没有安装 Homebrew&#xff0c;可以从它的官网上找到安装指令。 已安装 Homebrew的话&#xff0c;先更新一下homebrew brew update 你可以使用下面的命令来安装…...

免费SSL证书和付费SSL证书的区别点

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

【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)

题目描述 leetcode题目&#xff1a;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 设计器&#xff0c;下载完成之后我们就会得到…...

将二进制数a的每一位右移b位operator.rshift(a,b)

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

M芯片 mac配置Vulkan环境报错 Xcode

报错&#xff1a; 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) 解决&#xff1a;重新安…...

Day23:事务管理、显示评论、添加评论

事务管理 事务的定义 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元&#xff0c;这系列操作要么全执行&#xff0c;要么全放弃执行。 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的最小执行体&#xff08;事务中部分执行失败就会回滚 。一致性(C…...

第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》

第一篇&#xff1a;概述、目录、适用范围及术语 - IAB与MRC及《增强现实广告效果测量指南1.0》 --- 我为什么要翻译美国IAB科技公司系列标准 ​​​​​​​​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效…...

pytorch常用的模块函数汇总(2)

目录 torch.utils.data&#xff1a;数据加载和处理模块&#xff0c;包括 Dataset 和 DataLoader 等工具&#xff0c;用于加载和处理训练数据。 torchvision&#xff1a;计算机视觉模块&#xff0c;提供了图像数据集、转换函数、预训练模型等&#xff0c;用于计算机视觉任务。 …...

OpenAI奥特曼豪赌1.42亿破解长生不老

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

[晕事]今天做了件晕事29;iptables

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

2018年亚马逊云科技推出基于Arm的定制芯片实例

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

用搜索引擎收集信息-常用方式

1&#xff0c;site csdn.net &#xff08;下图表示只在csdn网站里搜索java&#xff09; 2&#xff0c;filetype:pdf &#xff08;表示只检索某pdf文件类型&#xff09; 表示在浏览器里面查找有关java的pdf文件 3&#xff0c;intitle:花花 &#xff08;表示搜索网页标题里面有花…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...