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

LeetCode hot 100 每日一题(15)——48.旋转图像

这是一道难度为中等的题目,让我们来看看题目描述:

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

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

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

题解

class Solution {public void rotate(int[][] matrix) {int n = matrix.length; // 获取矩阵的维度 n// **第一步:沿主对角线(左上到右下)翻转矩阵**// 交换 matrix[i][j] 和 matrix[j][i],即 matrix[i][j] 变为 matrix[j][i]for(int i = 0; i < n; i++){ // 遍历每一行for(int j = i; j < n; j++){ // 遍历当前行及其右侧部分,确保不重复交换int temp = matrix[i][j]; // 暂存 matrix[i][j] 的值matrix[i][j] = matrix[j][i]; // 交换两个对称位置的值matrix[j][i] = temp; // 赋值完成}}// **第二步:水平翻转每一行**// 将每一行的元素进行反转,使得第一列变为最后一列,实现顺时针旋转for(int[] row : matrix){reverse(row); // 调用 reverse 方法翻转当前行}}// **辅助方法:翻转一维数组**// 作用:将传入的数组左右翻转,即第一个元素与最后一个元素交换,第二个与倒数第二个交换,以此类推void reverse(int[] arr){int i = 0; // 左指针int j = arr.length - 1; // 右指针// 交换数组的左右对称元素while(i < j){int temp = arr[i]; // 暂存左侧元素arr[i++] = arr[j]; // 右侧元素赋值给左侧,同时左指针右移arr[j--] = temp; // 左侧元素赋值给右侧,同时右指针左移}}
}

题解思路解析

  1. 沿主对角线翻转

    • 交换 (i, j)(j, i) 位置的元素,将行变为列,实现 转置
    • 示例:
	 1  2  3      1  4  74  5  6  ->  2  5  87  8  9      3  6  9
  1. 水平翻转每一行

    • 将每一行的元素从左到右翻转,完成最终的旋转操作。

    • 示例:

    1  4  7      7  4  12  5  8  ->  8  5  23  6  9      9  6  3

最终结果是顺时针旋转 90 度 的矩阵。

这样就完成了 原地旋转,无需额外空间,时间复杂度 O(n²),空间复杂度 O(1)

注意在这份代码中,我们可以看到交换数组对应元素这段

 // 交换数组的左右对称元素while(i < j){int temp = arr[i]; // 暂存左侧元素arr[i++] = arr[j]; // 右侧元素赋值给左侧,同时左指针右移arr[j--] = temp; // 左侧元素赋值给右侧,同时右指针左移}

是之前一道题目复用的,用两个指针实现元素的交换,代码很简洁,链接见这里:189. 轮转数组

问题与解答

[NOTE] 问题1:

//沿对角线反转二维矩阵for(int i = 0; i < n; i++){for(int j = i; j < n; j++){int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}

这里的int j = i;为什么这样写?因为要翻转右上方的对角吗?
解答:
是的,int j = i; 的目的是只遍历右上三角区域,从而沿主对角线(左上到右下)进行翻转,避免重复交换。
详细解析

  1. 主对角线的概念
  • 以主对角线(matrix[i][i],即 (0,0) → (1,1) → (2,2) → …)为对称轴。

  • 交换 对角线两侧的元素,即 matrix[i][j]matrix[j][i]

  1. 为什么 j = i

    • j = i 确保只交换主对角线右上部分的元素,避免重复交换。

    • 如果 j0 开始,会导致元素被交换两次,最终不变

相关文章:

LeetCode hot 100 每日一题(15)——48.旋转图像

这是一道难度为中等的题目&#xff0c;让我们来看看题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…...

屏幕后处理Post-Processing安装及使用

一、安装Post-Processing插件 在 Window --- PackageManager 中搜索并安装 Post-Processing 二、添加后处理效果步骤 给场景中的相机Camera添加 Post - process Layer&#xff0c;只有添加了该组件的相机才会进行相应的后处理&#xff0c;此组件允许您为该后处理层配置抗锯齿…...

探索Halo:不止是博客,更是创作新宇宙

开篇&#xff1a;邂逅 Halo 作为一名热爱写作与分享的博主&#xff0c;拥有一个称手的博客系统一直是我的追求。在探索博客系统的旅程中&#xff0c;我尝试过不少平台&#xff0c;从 WordPress 到 Hexo &#xff0c;每一次转换都是为了寻找那个最完美的 “写作伴侣”。 WordP…...

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…...

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域&#xff0c;构建能够像人类一样理解、思考和行动的智能体&#xff08;AI Agent&#xff09;一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期&#xff0c;国内人工智能公司MiniMax重磅开源了其…...

数据库:一文掌握 Neo4J 的各种指令(Neo4J指令备忘)

文章目录 入门Neo4J运行 Neo4J 使用进入管理页面 图数据库概念 Neo4j 语法读取查询结构仅写入查询结构读取-写入查询结构 Neo4j 读取数据MATCHWHERERETURNWITHUNION Neo4j 写入数据CREATESETMERGEDELETEREMOVEFOREACH调用子查询调用存储过程导入运算符nullPatternsUSESHOW FUNC…...

Java面试第十三山!《设计模式》

大家好&#xff0c;我是陈一。如果文章对你有帮助&#xff0c;请留下一个宝贵的三连哦&#xff5e; 万分感谢&#xff01; 一、设计模式入门指南 1. 什么是设计模式&#xff1f; 设计模式是可复用的解决方案模板&#xff0c;用于解决软件开发中常见的架构问题。如同建筑领域的…...

从 @SpringBootApplication 出发,深度剖析 Spring Boot 自动装配原理

在 Spring Boot 的开发旅程中&#xff0c;SpringBootApplication 注解堪称开启便捷开发之门的钥匙。它不仅是一个简单的注解&#xff0c;更是理解 Spring Boot 自动装配原理的重要入口。接下来&#xff0c;我们将以SpringBootApplication 为切入点&#xff0c;深入探究 Spring …...

使用vue3和vue-router实现动态添加和删除cachedViews数组

以下是一个使用 Vue 3 和 Vue Router 实现动态添加和删除 cachedViews 数组的代码示例&#xff0c;该示例结合 keep-alive 组件来动态控制路由组件的缓存。 src/ ├── App.vue ├── router/ │ └── index.js ├── views/ │ ├── Home.vue │ ├── About.v…...

vue 点击放大,图片预览效果

背景&#xff1a; 在使用vue框架element组件的背景下&#xff0c;我们对图片的展示需要点击放大(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 单张图片放大&#xff0c;el-image图片组件&#xff0c;或者原生的img标签。 多张图片放大&…...

如何使用Xshell连接Linux虚拟机

在日常开发和运维工作中&#xff0c;远程连接Linux服务器或虚拟机是一项基本技能。Xshell 是一款功能强大的终端模拟器&#xff0c;支持通过 SSH 协议远程连接 Linux 系统。本文将详细介绍如何使用 Xshell 连接 Linux 虚拟机。准备工作 在开始之前&#xff0c;请确保你已经完成…...

笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化

一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划&#xff0c;其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的&#xff0c;但这样表示的话&#xff0c;并不利于我们去做规划&#xff0c;所…...

1 存储过程学习: 使用DMSQL程序的优点

DMSQL程序具有以下优点&#xff1a; 与SQL语言的完美结合 SQL语言已成为数据库的标准语言&#xff0c;DMSQL程序支持所有SQL数据类型和所有SQL函数&#xff0c;同时支持所有DM对象类型。在DMSQL程序中可以使用SELECT、INSERT、DELETE、UPDATE数据操作语句&#xff0c;事务控制…...

NPU上如何使能pytorch图模式

1 Pytorch的compile技术 PyTorch 的 torch.compile 是一个强大的功能&#xff0c;用于优化 PyTorch 模型的性能。它通过将 PyTorch 的动态图转换为静态图&#xff0c;并利用 Just-In-Time&#xff08;JIT&#xff09;编译技术&#xff0c;显著提高模型的推理速度和训练效率。 …...

进制转换(c++)

由于进制转换属于基础且比较重要&#xff0c;所以我就写一个博客方便自己复习&#xff0c;过程中如有错误&#xff0c;还请指出。 常用的进制有二进制&#xff0c;八进制&#xff0c;十进制和十六进制。 常用的进制转换就是十进制转换成其他进制和其他进制转换成十进制 我们先…...

2025-03-24 学习记录--C/C++-PTA 习题7-7 字符串替换

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题7-7 字符串替换 本题要求编写程序&#xff0c;将给定字符串中的大写英文字母按以下对应规则替换&#…...

为什么TCP需要三次握手?一次不行吗?

文章目录 1. 三次握手的过程2. 为什么需要三次握手&#xff1f;3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手&#xff0c;而不是两次或四次&#xff1f;6. 三次握手中的序列号有什么作用&#xff1f;7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…...

具身系列——NLP工程师切入机器人和具身智能方向

职位高频词汇&#xff1a;VLM调优经验、核心算法&#xff08;Diffusion、RL、VIT&#xff09;、pytorch、仿真环境&#xff08;Isaac Gym、Mujoco、webots&#xff09; 基于当前具身智能行业发展趋势和岗位需求&#xff0c;以下是为NLP工程师设计的转型路径与策略&#xff0c;…...

SpringBoot2集成Elasticsearch8(使用spring-boot-starter-data-elasticsearch)

写在前面 使用spring-boot-starter-data-elasticsearch集成Elasticsearch8&#xff1f; What? 官方写的不支持啊&#xff1f;让我们来看下官方给出的版本建议。 官方地址&#xff1a; https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.…...

【平台优化】持续调度参数在高负载大集群中的影响

持续调度参数在高负载大集群中的影响 背景介绍2种调度通信方式对集群的影响社区相关的讨论结论 背景介绍 这几年经历了我们大数据的Yarn集群的几次扩容&#xff0c;集群从原先的800多台增加到1300多台到现在的1600多台&#xff0c;在集群规模不断增加的过程中&#xff0c;有遇…...

军事级加密通信系统——基于QML的战术地图加密传输

目录 基于QML的战术地图加密传输一、引言二、理论背景与安全需求2.1 战术地图数据的敏感性与安全性要求2.2 QML与PyQt5集成优势2.3 加密算法与数据传输模型三、系统架构与数据流图四、QML前端界面设计与交互功能4.1 QML界面优势与设计理念4.2 功能要求4.3 QML文件示例五、加密传…...

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…...

(一)飞行器的姿态欧拉角, 欧拉旋转, 完全数学推导(基于坐标基的变换矩阵).(偏航角,俯仰角,横滚角)

(这篇写的全是基矢变换矩阵)不是坐标变换矩阵,坐标变换矩阵的话转置一下,之后会有推导. 是通过M转置变换到P撇点....

基于Spring Boot + Vue的银行管理系统设计与实现

基于Spring Boot Vue的银行管理系统设计与实现 一、引言 随着金融数字化进程加速&#xff0c;传统银行业务向线上化转型成为必然趋势。本文设计并实现了一套基于Spring Boot Vue的银行管理系统&#xff0c;通过模块化架构满足用户、银行职员、管理员三类角色的核心业务需求…...

数据库基础知识点(系列一)

1&#xff0e;数据库的发展历史分哪几个阶段&#xff1f;各有什么特点&#xff1f; 答&#xff1a;数据库技术经历了人工管理阶段、文件系统阶段和数据库系统三个阶段。 1&#xff09;人工管理阶段 这个时期数据管理的特点是&#xff1a; 数据由计算或处理它的程序自行携带…...

Android Compose 层叠布局(ZStack、Surface)源码深度剖析(十三)

Android Compose 层叠布局&#xff08;ZStack、Surface&#xff09;源码深度剖析 一、引言 在 Android 应用开发领域&#xff0c;用户界面&#xff08;UI&#xff09;的设计与实现一直是至关重要的环节。随着技术的不断演进&#xff0c;Android Compose 作为一种全新的声明式…...

JVM常用概念之身份哈希码

问题 当我们调用Object.hashCode时&#xff0c;如果没有用户没有提供哈希码&#xff0c;会发生什么&#xff1f; System.identityHashCode如何工作&#xff1f;它是否获取对象地址&#xff1f; 基础知识 在 Java 中&#xff0c;每个对象都有equals和hashCode &#xff0c;即…...

vue 对接 paypal 订阅和支付

一个是支付一个是订阅&#xff0c;写的时候尝试把他们放到一个里面&#xff0c;但是会报错&#xff0c;所以分开写了 我们的页面&#xff0c;前三个为订阅最后一个是支付&#xff0c;我把他们放到一个数组里面循环展示的&#xff0c;所以我们判断的时候只要判断id是否为4&#…...

Spring Boot - 动态编译 Java 类并实现热加载

为什么需要动态编译&#xff1f; 想象这样一个场景&#xff1a;你的系统需要实时更新业务规则&#xff0c;但重启服务会导致用户体验中断&#xff1b;或者你正在开发一款低代码平台&#xff0c;允许用户编写自定义逻辑并即时生效。这时&#xff0c;动态编译并加载 Java 类的能…...

基于javaweb的SpringBoot实习管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...