LeetCode 48 旋转图像

题目描述

旋转图像

给定一个 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. 解法1:临时数组

旋转特点:

  • 第一行而言,在旋转后,它出现在倒数第一列的位置;矩阵中的第二行而言,在旋转后,它出现在倒数第二列的位置
  • 以此类推得到规律:对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。
  • 即:对于矩阵中的元素 matrix[row][col],在旋转后,它的新位置为 matrix_new[col][n−row−1]

代码思路:

  • 我们使用一个与 matrix 大小相同的辅助数组 matrix_new ,临时存储旋转后的结果。
  • 然后遍历 matrix中的每一个元素,根据上述规则将该元素存放到 matrix_new中对应的位置。
  • 在遍历完成之后,再将 matrix_new中的结果复制到原数组中即可。

java代码:

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

复杂度

  • 时间复杂度:O(N^2), 其中 N 是 matrix的边长
  • 空间复杂度:O(N^2)
  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; 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;}}}
}

复杂度

  • 时间复杂度:O(N^2), 其中 N 是 matrix的边长
  • 空间复杂度:O(1)

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

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

相关文章

Vue.js 3 项目开发:迈向现代化前端开发的必经之路

文章目录 一、Vue.js 3简介二、Vue.js 3新特性1. Composition API2. 更好的性能3. 更好的TypeScript支持4. 更多的生命周期钩子5. 更好的自定义指令API 三、Vue.js 3项目开发实践1. 搭建开发环境2. 项目结构规划3. 组件开发4. 路由管理5. 状态管理6. 测试与部署 《Vue.js 3企业…

工业计算机应用——物流行业

工业计算机在物流行业的应用 随着全球化和电商的快速发展,物流行业已经成为现代经济体系中的重要支柱。在这个高度自动化的行业中,工业计算机扮演着至关重要的角色。本文将深入探讨工业计算机在物流行业的应用及其优势。 一、工业计算机在物流行业的应用场景 仓储管理工业计…

Viessmann Vitogate RCE漏洞复现(CVE-2023-45852)

0x01 产品简介 Viessmann Vitogate 300是用于将Viessmann LON连接到BACnet或Modbus的网关。 0x02 漏洞概述 Vitogate 300 组件/cgi-bin/vitogate.cgi中的一个问题允许未经身份验证的攻击者绕过身份验证&#xff0c;通过特制的请求执行任意命令&#xff0c;可导致服务器失陷。…

Linux如何将文件或目录打成rpm包? -- fpm打包详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

RPC教程 4.超时处理机制

0.前言 对比原教程&#xff0c;这里使用context来处理子协程的泄露问题。 1.为什么需要超时处理机制 超时处理是 RPC 框架一个比较基本的能力&#xff0c;如果缺少超时处理机制&#xff0c;无论是服务端还是客户端都容易因为网络或其他错误导致挂死&#xff0c;资源耗尽&…

【江科大】STM32:串口HEX/文本数据接收和发送(代码部分)(下)

串口发送 #include "stm32f10x.h" // Device header#include<stdio.h> #include<stdarg.h> void Serial_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPI…

latex画边框框加粗的表格

示例代码 \begin{table}[H]% 这四个距离分别控制toprule和buttomrule的上、下空白间距&#xff0c;如果不是0的话以后竖线和横线连不起来\abovetopsep0pt\aboverulesep0pt\belowrulesep0pt\belowbottomsep0pt\centering% \heavyrulewidth是\toprule和\bottomrule的默认宽度&am…

Vector容器的详细介绍

一、vector基本概念 1.1 功能&#xff1a; -vector 数据结构和数组非常相似&#xff0c;也称单端数组 1.2 vector与普通数组区别&#xff1a; - 不同之处在于数组是静态空间&#xff0c;而vector可以动态拓展 1.3 动态拓展&#xff1a; 并不是在原空间之后续接新空间&#xff…

Java面试题03——CAS

1.什么是CAS CAS英文全(Compare And Swap)指比较并交换。 CAS算法包含3个参数&#xff08;V,E,N&#xff09; V表示要更新的变量E表示预期的值N表示新值 在且仅在V值等于E值时&#xff0c;才会将V值设为N&#xff0c;如果V值和E值不同&#xff0c;则说明已经有其他线程做了更新…

如何做好培训管理?推荐使用这款培训管理系统(内附详细步骤+免费模板)

本文将为大家讲解&#xff1a;1、如何做好培训管理&#xff1f;2、如何使用零代码平台搭建培训管理系统&#xff1f; 培训管理&#xff0c;作为企业人力资源管理的核心环节&#xff0c;对于确保员工具备完成任务所需的专业知识和技能发挥着至关重要的作用。它不仅是提升员工绩…

北斗卫星为野外科考人员提供安全保障

北斗卫星为野外科考人员提供安全保障 自第二次青藏高原综合科学考察研究启动以来&#xff0c;青海不断提升科考服务保障能力&#xff0c;推动科考全程信息化&#xff0c;有效促进科考成果转化。 为保障科考人员的人身安全&#xff0c;青海省青藏科学考察服务中心开发了基于北…

CF1630A And Matching 题解

And Matching 传送门 You are given a set of n n n ( n n n is always a power of 2 2 2) elements containing all integers 0 , 1 , 2 , … , n − 1 0, 1, 2, \ldots, n-1 0,1,2,…,n−1 exactly once. Find n 2 \frac{n}{2} 2n​ pairs of elements such that: Ea…

宝藏api推荐,热门、免费、好用

台风信息查询&#xff1a;提供西北太平洋及南海地区过去两年及当前年份所有编号台风的信息查询&#xff0c;包括台风实时位置、过去路径、预报路径及登陆信息等要素。短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可…

第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)

文章目录 第08章_面向对象编程(高级)本章专题与脉络1. 关键字&#xff1a;static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 …

UI设计中的插画运用优势(下)

6. 插画赋予设计以美学价值&#xff0c;更容易被接受 即使所有人都在分析和争论产品的可用性和易用性&#xff0c;大家在对美的追求上&#xff0c;始终保持着一致的态度。一个设计是否具备可取性&#xff0c;是否能够通过甲方、客户和实际用户&#xff0c;是每个设计人都需要面…

高频一体式读写器的应用及其原理

高频一体式读写器作为一款读写设备&#xff0c;将RFID读写模块和天线集于一体&#xff0c;通过天线与RFID标签进行无线通信&#xff0c;实现对标签的识别和内存数据的读出或写入操作。具备安全、准确、快速、扩展、兼容性强等特点&#xff0c;具备非接触识别、远距离识别、环境…

Laravel 10.x 里如何使用ffmpeg

原理上很简单&#xff0c;就是使用命令行去调用ffmpeg&#xff0c;然后分析一下输出是不是有错误。 安装 首先安装 symfony/process&#xff0c;主要用于包装一下&#xff0c;用来代替 exec, passthru, shell_exec and system 。 composer require symfony/process composer…

PowerShell install 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

linux性能优化-磁盘I_O优化

1.文件系统 1.1.文件系统的工作原理 文件系统是在磁盘的基础上&#xff0c;提供了一个用来管理文件的树状结构。 接下来我们就看看Linux 文件系统的工作原理。 1.1.1索引节点和目录项 在 Linux 中一切皆文件 ,文件系统,本身是对存储设备上的文件&#xff0c;进行组织管理的…

【Linux】—— 共享内存

本期我将要带大家学习的是有关进程间通信的另一种方式——共享内存。共享内存是一种用于进程间通信的高效机制&#xff0c;允许多个进程访问和操作同一块内存区域。 目录 &#xff08;一&#xff09;深刻理解共享内存 1.1 概念解释 1.2 共享内存原理 1.3 共享内存数据结构 …