【LeetCode48:旋转图像(附Java代码)】

news/2024/5/6 7:08:34/文章来源:https://blog.csdn.net/qq_43665602/article/details/127348356

旋转图像

  • 一、题目描述
    • 1.题目内容
    • 2.样例
  • 二、解决方案
    • 1.算法流程
      • 1)分析
      • 2)算法流程
    • 2.Java代码
      • 1)核心代码
      • 2)完整测试代码

一、题目描述

1.题目内容

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

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
原题链接:https://leetcode.cn/problems/rotate-image/

2.样例

在这里插入图片描述

二、解决方案

1.算法流程

1)分析

题目中要求“原地”进行矩阵旋转操作,“原地”的理解为:在原输入矩阵matrix所对应的内存位置中进行操作。所以可以从两个角度解决本题:

  • (1)直接在matrix上进行操作,通过矩阵旋转前后对应元素之间的坐标关系实现;
  • (2)借助辅助矩阵tempMatrix拷贝matrix的内容,内存中tempMatrix和matrix对应不同的区域,然后通过旋转前后的元素坐标之间的关系实现(题目中说不让使用辅助矩阵,但借助辅助矩阵的方法一次就过了,而且官方题解方法一就是借助辅助矩阵…);

不管使用那种方法实现,重点均是找到矩阵旋转前后的元素坐标之间的关系。

以样例中的4×4矩阵为例,我们看一下其旋转前后对应元素坐标之间的关系:
在这里插入图片描述
可以看到,对于原输入矩阵matrix和旋转90度后的矩阵rotatedMatrix,rotatedMatrix中的第col列数据为matrix中的第n-1-col行数据,且rotatedMatrix中的第col列数据从row=0,1,…,n与matrix中的第n-1-col行数据从col=0,1,…,n元素一一对应
由此得到rotatedMatrix与matrix对应元素之间的坐标关系为:
在这里插入图片描述
以元素rotatedMatrix[0][3]=5为例,其对应matrix[4-1-3][0]=matrix[0][0]。

2)算法流程

  • 创建一个辅助矩阵tempMatrix,对matrix进行拷贝,因此其大小为n×n,且矩阵内容与matrix完全一致;
  • 此时,可将matrix、tempMatrix分别视为公式中的rotatedMatrix和matrix;
  • 以tempMatrix为对照矩阵,在matrix上利用二者对应元素之间的关系完成旋转操作,以遵守“原地”操作的条件;

此处借助辅助矩阵实现,其实官方题解中的方法三,通过两次翻转矩阵替换旋转的方式也很好理解,感兴趣的可去官网查看。

2.Java代码

1)核心代码

    public static void rotate(int[][] matrix){// 构建辅助矩阵,且拷贝matrix的内容int[][] tempMatrix=new int[matrix.length][];for(int i=0;i<matrix.length;i++){tempMatrix[i]=new int[matrix[i].length];for(int j=0;j<matrix[i].length;j++){tempMatrix[i][j]=matrix[i][j];}}// 借助tempMatrix在matrix上完成旋转操作的实现for(int i=0;i<matrix.length;i++){for(int j=0;j<matrix[i].length;j++){matrix[i][j]=tempMatrix[matrix.length-1-j][i];}}}

在这里插入图片描述
很显然,借助辅助矩阵的代价就是拿空间换时间了…

2)完整测试代码


/*** LeetCode48:旋转图像* */
import java.util.Arrays;public class RotateMatrix {public static void main(String[] args) {int[][] matrix=new int[3][];matrix[0]=new int[]{1,2,3};matrix[1]=new int[]{4,5,6};matrix[2]=new int[]{7,8,9};//        printMatrix(matrix);rotate(matrix);}/*** 矩阵旋转90度* 1.创建辅助矩阵tempMatrix=matrix(这里是指矩阵数据对应元素相同,但二者内存中不在同一位置);* 2.基于tempMatrix进行旋转:matrix的第i列数据对应tempMatrix的第n-1-i行;* */public static void rotate(int[][] matrix){// 构建辅助矩阵,且拷贝matrix的内容int[][] tempMatrix=new int[matrix.length][];for(int i=0;i<matrix.length;i++){tempMatrix[i]=new int[matrix[i].length];for(int j=0;j<matrix[i].length;j++){tempMatrix[i][j]=matrix[i][j];}}// 借助tempMatrix在matrix上完成旋转操作的实现for(int i=0;i<matrix.length;i++){for(int j=0;j<matrix[i].length;j++){matrix[i][j]=tempMatrix[matrix.length-1-j][i];}}}// 遍历矩阵public static void printMatrix(int[][] matrix){int rows= matrix.length;for(int i=0;i<rows;i++){System.out.println(Arrays.toString(matrix[i]));}}
}

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

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

相关文章

metamask api 请求 一般操作

参考文档&#xff1a;https://docs.metamask.io/guide/ 注意 metamask 必须是运行在站点之下的 web 页进行操作。 一、检查 metamask 是否安装 metamask 提供了 window.ethereum 供开发者对 metamask&#xff08;以太坊网络&#xff09; 进行交互&#xff0c;当然是需要你已…

DO、VO、BO、DTO、POJO

DO:Domain Object 即数据库表字段 在Java中一一对应关系(有人称它实体类) BO:Business Object 即业务对象,Service层向上传传输的对象。是多个DO的组合形式 VO:view oject 展示层对象,通过接口向前端输出展示的对象 DTO:Date Transfer Object 数据传输对象,controll…

《Linux下软件的管理》

【一】Linux软件包yum 什么是软件包&#xff1f; 在Linux下安装软件&#xff0c;一个通常的办法就是下载程序的源代码&#xff0c;并经行编译&#xff0c;既可得到可执行程序&#xff0c;但是这种办法属实是太麻烦了&#xff0c;因为下载要时间&#xff0c;编译要时间&#x…

根文件系统简介

根文件系统 根文件系统一般也叫做rootfs&#xff0c;那么什么叫根文件系统&#xff1f;看到“文件系统”这四个字&#xff0c;很多人&#xff0c;第一反应就是FATFS、FAT、EXT4、YAFFS和NTFS等这样的文件系统。在这里&#xff0c;根文件系统并不是FATFS这样的文件系统代码&…

SpringCloudAlibaba 通过Dubbo实现微服务之间的RPC调用

目录 一、创建模块化项目 二、公共api接口模块 三、服务提供者 四、服务调用者 五、测试 六、案例代码 在微服务架构中&#xff0c;微服务之间的调用一般我们有两种比较好的解决策略&#xff0c;分别是通过OpenFeign的基于http协议的传输的调用和基于RCP协议的Dubbo框架来…

基于SSM的餐饮管理系统的设计与实现

目 录 前 言 1 第1章 概述 2 1.1 选题背景及意义 2 1.2 技术概述 2 1.2.1 JSP技术概述 2 1.2.2 SpringSprngMVC介绍 3 1.2.3 MySQL数据库概述 3 1.2.4 Mybatis介绍 3 1.2.5 Maven介绍 3 1.3 开发平台介绍 4 1.3.1 Tomcat服务器 4 1.3.2 Eclipse简介 4 第2章 可行性研究 5 2.1 技…

Redis学习和笔记

Redis学习 作为一个程序员&#xff0c;你没有办法不学Redis redis是一个NoSql的&#xff08;远程字典服务的&#xff0c;key_value的数据库&#xff09; redis 能干嘛 内存存储&#xff0c;持久化&#xff0c;内存中是断电就失去&#xff0c;所有说持久化很重要效率高&#…

Linux Command mount 挂载

Linux Command mount 挂载 tags: 文件管理 文章目录Linux Command mount 挂载1. 简介2. 语法3. 退出状态4. 命令选项5. mount 挂载5.1 列出挂载的文件系统5.2 列出特定文件系统5.3 挂载文件系统5.4 使用 /etc/fstab 挂载文件系统5.5 挂载 USB 驱动器5.6 安装 CD-ROM5.7 挂载 I…

电路方案分析(十二)USB Type-C PD 移动电源参考设计方案

USB Type-C PD 移动电源参考设计方案 tips&#xff1a;TI设计方案参考分析&#xff1a;TI Designs&#xff1a;TIDA-01627 1.系统描述 2.系统概述 3.系统供电方案 4.测试数据 5.设计文件 6.关键术语 说明 此移动电源参考设计提供高度集成的 USB Type-C™电力传输 (PD) 解决…

Docter安装

上传安装包 docker-ce-18.06.0.ce-3.el7.x86_64.rpm 安装 yum install docker-ce-18.06.0.ce-3.el7.x86_64.rpm -y 启动docter systemctl start docker systemctl stop docker systemctl restart docker systemctl status docker&#xff08;查看状态&#xff09; 查看doct…

浮点型在内存中的存储

目录 1、浮点数的存储方式 (1) 转化为二进制 (2) 转化为国际标准形式 (3) 使用国际标准形式存储 (4) 存储方式验证 2、从内存中取出浮点数需满足的规则 (1) E 不全为0 或 不全为1 (2) E 全为 0 (3) E 全为 1 浮点数在内存中存储的方式和整型不一样。所以我们在存储的…

2022/10语音识别大作业:基于HMM(隐马尔可夫模型)的Matlab孤立数字语音识别

别看了你要找的就在这。csdn上所有这方面的资源都是收费的&#xff0c;而且没有直接能用的好的&#xff0c;我的也是基于重金买来的两份结合起来做了三天的大修之后才能运行。所以这也不是一份免费分享。但是本文解决了其他资源没有解决的问题&#xff0c;所以50是一个公道的价…

C++——程序员的逼格神器-github

github的重要性&#xff1a; 网络时代的程序员必备。 github的作用&#xff1a; 版本管理多人协作开源共享 常用方案&#xff1a; gitTortoiseGitgithub [Tortoise&#xff0c;程序员常称其为小乌龟&#xff0c;小海龟] 安装配置步骤 1.注册 GitHub: Where the world bui…

JVM之对象的内存模型、创建过程、对象引用、生命周期

JVM之对象的内存模型、创建过程、对象引用、生命周期Java对象内存模型对象头实例数据对齐填充部分对象的创建类加载检查分配内存初始化零值设置对象头执行init方法引用计数法对象的引用强引用软引用弱引用虚引用对象的生命周期创建阶段(Created)应用阶段(In Use)不可见阶段(Inv…

代理ARP (路由式代理ARP+vlan内代理ARP+vlan间代理ARP) [理论+实验验证]

衷心感谢三位大佬的博客 ! ! ! ! 这篇博客主要是为了记录笔记方便查看而整理&#xff0c; 主要内容整理来源&#xff1a; (58条消息) 代理ARP实验_在下小黄的博客-CSDN博客_arp代理实验 (58条消息) 代理ARP_士别三日wyx的博客-CSDN博客_arp代理 (59条消息) 华为ARP代理的三种方…

字节在职三年,如何想要三个月内将软件测试学好,我建议你这样学

目录 13年本科毕业&#xff0c;目前已经工作将近7年时间&#xff0c;第一段工作是在字节工作3年时间&#xff0c;目前是再另外一家大厂工作。今天跟大家分享一下我工作的心得&#xff0c;希望对你有所帮助 我对软件测试的理解 软件测试是软件开发的最后一道防线&#xff0c;…

【Vue 快速入门系列】样式绑定与条件渲染

文章目录前言样式绑定条件渲染前言 在vue中好像一切数据都是可以动态的&#xff0c;那么我们应如何让dom元素中的样式动起来呢&#xff1f;我们既然可以改变dom元素的样式&#xff0c;我们能不能将其隐藏起来呢&#xff1f;今天将会介绍到Vue中如何将属性与dom元素的样式进行绑…

Java List 扩容机制探究(ArrayList 、Vector、LinkedList)

文章目录List扩容ArrayList 扩容机制结论&#xff1a;无参构造创建的ArrayList的初始空间为0&#xff0c;在添加第一个元素的时候空间会默认为10&#xff0c;之后扩容会为当前容量的1.5倍。0->10->15->22->33->49源码分析1.ArrayList list new ArrayList();2. …

Android多媒体架构

Android多媒体架构 要实现我们的媒体播放器 主要使用的就是android media MediaPlayer 这样的一个类 来为我们的播放器的实现提供一个主要功能 而这个类的实现又依赖于 JNI层的 1)一些接口 2)Libmedia.so 库 (这个库才是 mediaplayer类的真正实现) 再往下就是我们的se…

产品能力|书山有路-趣味算法(第二版)读书笔记part1

系列文章目录 趣味算法&#xff08;第二版&#xff09;读书笔记&#xff1a; day1: 序章|学习的方法和目标. day2:算法之美|打开算法之门与算法复杂性 day3.算法之美|函数特性与图形 day4.数学之美|斐波那契数列 后续补充完善 提示&#xff1a;写完文章后&#xff0c;目录可以…