Java旋转矩阵

news2024/9/28 5:53:02

题目:
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 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]
]

作者:LeetCode
链接:https://leetcode.cn/leetbook/read/array-and-string/clpgd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

--------------------------------------------------------------------------------------------

解答1:来自评论区的Firesnow

一 、找到坐标变化规律


长度为N的矩阵
顺时针旋转 90 度后会发现
第I行会变为倒数第I列
第J列会变为第J行
所以对应关系为[I,J] -> [J,N-1-I] (这里为N-1是因为坐标从0开始所以最大的坐标为N-1)
旋转时每个坐标都有与之对应的3个坐标点,总共4个坐标点相互互换位置
[I,J] -> [J,N-1-I] -> [N-1-I,N-1-J] -> [N-1-J,I] -> [I,J]
所以我们只需要遍历 1/4 的坐标,然后变动对应的 4 组坐标 即可实现全部坐标的替换

二、确定遍历范围


遍历 1/4 的范围有两种方式


图 1
图一的遍历范围为 I(0-> N/2),J(0->N/2) 总面积为N/2 * N/2=N方/4
是最容易想到的方式,相当于把正方形横竖分为 4 个小正方形
当N为偶数时没有什么问题,但当N为奇数比如图中N为5时,总共5*5=25个点,去除最中间1个点无需变动,我们需要遍历 24/4=6个点
这时候用此方式切割就没办法实现等分遍历了

图 2
图二的遍历范围为 I(0->N),J(I->N-1-I) 总面积为 N * N/2 * 1/2=N方/4(三角形面积)
相当于把正方形分为 4 个等腰直角三角形
这种分割方式即使 N 为奇数也可以正常等分,图例中可以在每个三角形中取到独占的 6 个点
需要注意的是(0,4),(1,3) 这两个点不能包含起来 所以遍历的时候判断条件不能等于

所以使用图 2 的遍历方式 把遍历到的每个点和与之对应的其他三个点互换值即可实现旋转

三、不占用额外空间


这时我们已经知道本题只需要找到正确的坐标对互换值即可
题目中问到不占用额外内存空间能否做到?
就是问如何不占用额外的内存空间,来交换A,B两个值
聪明的你已经想到方法
A = A+B
B = A-B
A = A-B
这三步之后我们就实现了不占用额外的内存空间,交换了 AB 的值

四、实现代码


到这里我们心中已经有了题目的答案了


    public static void rotate(int[][] matrix) {
        for (int i = 0; i < matrix.length - 1; i++) {
            for (int j = i; j < matrix.length - 1 - i; j++) {
                exchange(matrix, i, j, j, matrix.length - 1 - i);
                exchange(matrix, i, j, matrix.length - 1 - i, matrix.length - 1 - j);
                exchange(matrix, i, j, matrix.length - 1 - j, i);
            }
        }
    }

    public static void exchange(int[][] matrix, int i1, int j1, int i2, int j2) {
        matrix[i1][j1] = matrix[i1][j1] + matrix[i2][j2];
        matrix[i2][j2] = matrix[i1][j1] - matrix[i2][j2];
        matrix[i1][j1] = matrix[i1][j1] - matrix[i2][j2];
    }
作者:Firesnow
链接:https://leetcode.cn/leetbook/read/array-and-string/clpgd/?discussion=ut8ZJl
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解答二:

Java旋转矩阵 | 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到?

对于我来说

知道要找规律,但是找不着规律😅

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

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

相关文章

运筹从业者也需要的因果推断入门:基础概念解析和体系化方法理解

文章目录 1 引言2 相关关系 VS 因果关系2.1 相关关系2.2 因果关系2.3 相关关系不等于因果关系 3 因果推断方法3.1 方法体系3.2 方法理解 4 运筹从业者也需要因果推断4.1 问题描述4.2 算法方案4.3 算法验证 5 总结6 相关阅读 1 引言 已经3月初了&#xff0c;原计划的因果推断学…

抖音在线点赞任务发布接单运营平台PHP网站源码多个支付通道+分级会员制度,附带系统搭建教程

介绍 1、三级代理裂变&#xff0c;静态返佣/动态返佣均可设置。&#xff08;烧伤制度&#xff09;。 2、邀请二维码接入防红跳转。 3、自动机器人做任务&#xff0c;任务时间可设置&#xff0c;机器人价格时间可设置。 4、后台可设置注册即送X天机器人。 5、不同级别会员使…

浅谈JUC的理解(含JUC知识体系图)

浅谈JUC的理解 一、前言感悟二、并发知识三、一年前回答四、补充体系回答五、补充层次回答六、碎碎念 本文除了说技术&#xff0c;更多的是在一个两年多开发经验的程序员视角下&#xff0c;记录下自己探索到的世界。 如有不妥之处&#xff0c;还请指正。共勉。 一、前言感悟 当…

上海雷卯湿敏元器件存储及使用规范

湿敏等级是指材料或产品对湿度变化的敏感程度。它用于评估材料或产品在湿度变化条件下的稳定性和可靠性。 湿敏等级通常通过数字表示&#xff08;如MSL- Moisture Sensitivity Level&#xff09;&#xff0c;从1到6级不等&#xff0c;每个级别代表不同的湿敏程度。较低的级别表…

基于网络爬虫的购物平台价格监测系统的设计与实现

通过对网络爬虫的购物平台价格监测系统的业务流程进行梳理可知&#xff0c;网络爬虫的购物平台价格监测系统主要由前台买家模块、后台卖家模块以及管理员模块构成。前台功能包含登录功能、注册功能、系统首页功能、唯品会商品详情浏览、唯品会商品收藏、唯品会商品点赞、唯品会…

9. 内核、文件系统加载工具

内核、文件系统加载工具 内核、文件系统加载工具是嵌入式开发必备的工具 1. 烧写BootLoader 1.1 通过超级终端方式 烧写 Bootloader 可以使用超级终端的“传送” |“发送文件”命令进入发送文件对话框&#xff0c;使用 Xmodem 协议和 Kermit 协议发送 Bootloader 的各个文件…

DenseNet笔记

&#x1f4d2;from ©实现pytorch实现DenseNet&#xff08;CNN经典网络模型详解&#xff09; - 知乎 (zhihu.com) 是什么之 DenseBlock 读图&#xff1a; x0是inputH1的输入是x0 (input)H2的输入是x0和x1 (x1是H1的输出) Summary&#xff1a; 传统卷积网&#xff0c;网…

角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…

python学习笔记------集合(set)

集合定义格式 基本语法&#xff1a; #定义集合字面量 {元素&#xff0c;元素&#xff0c;元素......&#xff0c;元素} #定义集合变量 变量名称{元素&#xff0c;元素&#xff0c;元素......&#xff0c;元素} #定义空集合 变量名称set() #定义集合字面量 {元素&#…

海纳斯Hinas安装Tailscale

海纳斯Hinas安装Tailscale 海纳斯安装Tailscale第一步&#xff0c;注册Tailscale账号&#xff0c;并在手机/电脑安装Tailscale第二步&#xff0c;进入海纳斯后台卸载重装Tailscale 海纳斯安装Tailscale 海纳斯自己安装了Tailscale&#xff0c;但是无法使用&#xff0c;需要卸载…

GPU,一统天下

三十年前&#xff0c;CPU 和其他专用处理器几乎处理所有计算任务。那个时代的显卡有助于加快 Windows 和应用程序中 2D 形状的绘制速度&#xff0c;但没有其他用途。 快进到今天&#xff0c;GPU 已经成为业界最具主导地位的芯片之一。 但具有讽刺意味的是&#xff0c;图形芯片…

系统分析与设计(一)

我们有这么多各式各样的工具,互联网给我们带来了这么多用户和数据,这是好事也有副作用。 世界上能访问用户数据,并根据数据做分析和改进的公司,大概Google是其中翘楚,这种 data-centric 的做法做过了头,也有悲剧发生: Douglas Bowman 曾经是Google 的视觉设计主管,2009年的一天…

2013-2021年全国31省电子商务销售额数据(无缺失)

2013-2021年全国31省电子商务销售额数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2013-2021年 2、指标&#xff1a;电子商务销售额数据 3、来源&#xff1a;国家TJ局、各省NJ 4、范围&#xff1a;31省 5、缺失情况&#xff1a;无缺失 6、指标解释&#xff1a;…

JavaScript高级Ⅱ(全面版)

接上文 JavaScript高级Ⅰ JavaScript高级Ⅰ(自认为很全面版)-CSDN博客 目录 第2章 DOM编程 2.1 DOM编程概述 2.1.4 案例演示(商品全选) 2.1.5 dom操作内容 代码演示&#xff1a; 运行效果&#xff1a; 2.1.6 dom操作属性 代码演示&#xff1a; 运行效果&#xff1a; 2…

程序设计基础--C语言【一】

课堂笔记 1.整数数制 整数数制包括二进制数、八进制数、十进制数、十六进制数 1.1.十进制数 基数为10&#xff0c;由0到9这十个数构成。例如&#xff0c;4261可以看作是&#xff1a; &#xff08;4*1000&#xff09;&#xff08;2*100&#xff09;&#xff08;6*10&#x…

最简单的电子书制作方法

制作电子书的方法有很多种&#xff0c;但最简单的一种可能就是使用在线工具了。现在有很多免费的在线工具可以让您轻松地创建电子书&#xff0c;而无需任何编程或设计技能。以下是最简单的电子书制作方法&#xff1a; 1. 准备好制作工具&#xff1a;FLBOOK在线制作电子杂志平台…

内存管理 --- 页面置换算法

最优置换&#xff1a;&#xff08;参照未来OPT&#xff09; 可以将将来很长一段时间不会访问的逻辑页面&#xff0c;进行置换 举例说明&#xff1a; 首先物理空间只有4个&#xff0c;然后遍历了ABCD 页&#xff0c;其中&#xff0c;要访问5 e 了但是没有&#xff0c;即发生缺页…

登录凭证------

为什么需要登录凭证&#xff1f; web开发中&#xff0c;我们使用的协议http是无状态协议&#xff0c;http每次请求都是一个单独的请求&#xff0c;和之前的请求没有关系&#xff0c;服务器就不知道上一步你做了什么操作&#xff0c;我们需要一个办法证明我没登录过 制作登录凭…

【LLM】Advanced rag techniques: an illustrated overview

note 文章目录 noteAdvanced rag techniques: an illustrated overview基础RAG高级RAG分块和向量化(Chunking & Vectorisation)搜索索引(Search Index)1. 向量存储索引&#xff08;Vector Store Index&#xff09;2. 多层索引(Hierarchical Indices)3. 假设问题和HyDE(Hypo…

【笔记】全国大学生GIS应用技能大赛练习总结

该总结笔记为小组成员在练习完毕了历届题目后自我总结的结果&#xff0c;如有不足之处可以在评论区提出&#xff0c;排版较乱往谅解 绘制带空洞的面要素&#xff1a; 法一&#xff1a; 1、矢量化整个区域。2、矢量化空洞区域。3、将矢量化空洞区域进行合并&#xff08;编辑器…