旋转图像(旋转矩阵)

news2024/11/25 12:55:19
原题链接

旋转图像备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/rotate-image/

算法分析

        若矩阵的行列数为N,设i表示行索引,i属于[1,N],按照题意旋转矩阵则可以理解为我们需要将第i行的所有元素转换为第N-i+1列,如示例1所示,第1行为[1,2,3],旋转后的第1行则变成了第3列,第2行与第3行同样如此。

图(1)
图(2)

        PS:经现有测试该方法适用于行列数相同的矩阵,但不确定是否适用于行列数不同的矩阵。

        如图(1)索引分别为(0,0),(0,1),(0,2),(0,3),(1,3),(2,3),(3,3),(3,2),(3,1),(3,0),(2,0),(1,0)的点围成了一个圈,假设我们称之为矩阵圈。那么由外向内我们依次称为第1层矩阵圈,第2层矩阵圈,……第n层矩阵圈。图(1)所示有两个矩阵圈,第1层矩阵圈的索引集合为[(0,0),(0,1),(0,2),(0,3),(1,3),(2,3),(3,3),(3,2),(3,1),(3,0),(2,0),(1,0)],第2层矩阵圈的索引集合为[(1,1),(1,2),(2,2),(2,1)]。

        如图(1)和图(2)我们可以发现通过对每个矩阵圈的旋转即可完成对整个矩阵的旋转,而对矩阵圈的旋转实际上就是对矩阵圈进行点交换。点交换的意思是交换矩阵圈四个边上的点,并且每个点是相互对应的。

        如图(3)所示,第一次交换索引为(0,0)和索引为(0,3)的点,第二次交换索引为(0,0)和索引为(3,3)的点,第三次交换索引为(0,0)和索引为(3,0)的点,我们把这称为矩阵圈的点交换。而这仅仅是矩阵圈的第一次点交换,假设该矩阵圈的行数和列数均为m,那么旋转该矩阵圈则需要(m-1)次点交换。

图(3)
图(4)
图(5)
图(6)

        图(3)(4)(5)(6)则为该矩阵圈的一次完整的90°旋转。

        为了从定量角度分析这个规律。首先我们可以定义四个变量rowA,rowB,colA,colB分别表示每一个矩阵圈的首行尾行以及首列尾列,并对它们进行初始化,rowA=0,rowB=m-1,colA=0,colB=m-1,rowA指向当前矩阵圈第一行,rowB指向最后一行,colA指向当前矩阵圈第一列,colB指向最后一列。其次我们再定义一个变量count,表示当前矩阵圈需要进行点交换的次数,count属于[1,m-1]。那么该矩阵圈进行点交换的四个点的索引分别为:

(rowA,colA+count-1),  (rowA+count-1,colB),

(rowB,colB-count+1),  (rowB-count+1,colA)

        我们只需要按照(rowA+count-1,colB),(rowB,colB-count+1),(rowB-count+1,colA)的索引顺序分别与索引为(rowA,colA+count-1)的点进行交换即可,每完成一次点交换则count进行+1操作,当count等于m-1时表示该矩阵圈的90°旋转完成。所以接下来需要收缩rowA,rowB,colA,colB四个变量,从而指向下一层矩阵圈,收缩操作即对rowA和colA进行+1操作,对rowB和colB进行-1操作,重复上述过程从外向内旋转矩阵圈直至rowA、rowB、colA、colB四个变量的值相等则表明整个矩阵完成了90°的旋转。

代码示例(C#) 
public void Rotate(int[][] matrix)
{
    //定义变量
    int rowA = 0, rowB = matrix.Length - 1, colA = 0, colB = matrix[0].Length - 1, count = 1;
    //逻辑主体
    while (count <= colB - colA)
    {
        //矩阵点交换
        (matrix[rowA][colA + count - 1], matrix[rowA + count - 1][colB]) = (matrix[rowA + count - 1][colB], matrix[rowA][colA + count - 1]);
        (matrix[rowA][colA + count - 1], matrix[rowB][colB - count + 1]) = (matrix[rowB][colB - count + 1], matrix[rowA][colA + count - 1]);
        (matrix[rowA][colA + count - 1], matrix[rowB - count + 1][colA]) = (matrix[rowB - count + 1][colA], matrix[rowA][colA + count - 1]);
        //矩阵圈收缩
        if (count == colB - colA)
        {
            colA++;
            colB--;
            rowA++;
            rowB--;
            count = 1;
        }
        else count++;
    }
}
算法解说 

        结合算法分析过程,我们将矩阵的旋转转换为矩阵圈的旋转,然后将矩阵圈的旋转转换为矩阵点的交换,也就是说矩阵旋转的本质就是矩阵中各个元素的交换,实际上我们从图(1)和图(2)就可以发现,转换前的矩阵的第一行变成了转换后的矩阵的最后一列,但是本文的解题思路并未采取这种方式。

       由于每个矩阵圈都有四条边,所以旋转矩阵圈就是在交换四个边上指定的元素,具体的思路算法分析中已经描述得比较详尽,对于如何将分析过程转换为代码,对于多数算法题来说本质上都是明确两个重点,一个是变量,一个是逻辑主体。本题中所用到的变量包括用于明确当前矩阵圈的四个指针,还有一个用于记录当前矩阵圈进行点交换的次数。而逻辑主体则包括矩阵点交换和矩阵圈收缩,同时需要明确逻辑主体退出的条件。

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

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

相关文章

如何定位线上CPU飙高的问题

1.问题情景 我们的接口卡死&#xff0c;CPU飙高到打不开的网页 2.问题定位 2.1 top指令 通过top命令找到CPU耗用最厉害的那个进程的PID 直接输入top Linux下的100%代表一个核心&#xff0c;如果是八核&#xff0c;最高可以到800%&#xff0c;这样才算满 然后通过PID找到CP…

设计模式再探——策略模式

目录 一、背景介绍二、思路&方案三、过程1.策略模式简介2.策略模式的类图3.策略模式代码4.策略模式还可以优化的地方5.策略模式的例子改造(配置文件反射) 四、总结五、升华 一、背景介绍 最近在做产品的过程中&#xff0c;对于主题讨论回复内容&#xff0c;按照追评次数排…

Java学习手册——第一篇Java简介

今后Java学习手册就来给大家梳理JavaSE的基础知识啦&#xff0c; 除了这个专栏我们还有其他专栏&#xff1a;前端、安全、后端等。 希望大家可以在这里一起讨论学习哟~ Java学习手册——第一篇Java简介 1. Java基础知识2. Java能干嘛3. Java基础环境搭建 1. Java基础知识 出生…

BANI时代下的项目管理:如何迎接挑战与机遇

BANI时代的介绍与特点 BANI时代的起源 BANI这个概念首次被提出是为了描述和理解我们所处的复杂、多变、不确定的时代。与VUCA&#xff08;Volatile, Uncertain, Complex, Ambiguous&#xff09;相比&#xff0c;BANI更加准确地捕捉了我们面临的现实挑战。VUCA重点关注外部环境…

【基础操作】Linux打开terminal,Anaconda默认进入的虚拟环境(python版本)设置(自行指定)

为了免除每次打开terminal都要输入 conda activate … 的麻烦&#xff0c;可以这么设置。 1. 打开terminal&#xff0c;然后输入命令 vim ~/.bashrc2. 然后在文件末尾添加 conda activate your_envs # your_envs是你的虚拟环境名称3. 保存退出&#xff0c;重新打开就成功啦…

第八课 双重所有格和不定代词

系列文章目录 文章目录 系列文章目录前言一、of s 的所有格1、of 有生命的名词 ’s2、of 名词性物主代词3、小结 二、反身代词1、作宾语和介词宾语2、作表语3、作固定惯语 三、相互代词四、指示代词 Such 和 Same 的用法 前言 一、of s 的所有格 1、of 有生命的名词 ’s 2、…

大数据课程I3——Kafka的消息流与索引机制

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的消息流处理; ⚪ 掌握Kafka的索引机制; ⚪ 掌握Kafka的消息系统语义; 一、Kafka消息流处理 1. Producer 写入消息 流程说明: 1. producer 要向Kafka生产消息,需要先通过…

ORB-SLAM2第二节---双目地图初始化

比起单目初始化&#xff0c;而双目实现地图的初始化非常简单&#xff0c;只需要一帧&#xff08;左右目图像&#xff09;即可完成初始化。 行特征点统计。考虑用图像金字塔尺度作为偏移量&#xff0c;在当前点上下正负偏移量&#xff08;r)内的纵坐标值都认为是匹配点可能存在…

centos7 nginx1.18.0离线升级至1.25.1

centos7 nginx1.18.0离线升级至1.25.1 项目背景 系统&#xff1a;centos 7 nginx版本&#xff1a; 1.18.0 最近护网行动查出来 有关Nginx的几个安全漏洞&#xff0c;解决方案只需要更新Nginx版本到最新即可。 Nginx升级过程 1. 下载新版本nginx 下载地址&#xff1a;https:…

【0.2】lubancat鲁班猫4远程ubuntu22.04.2 无需任何安装

环境 lubancat4鲁班猫4 (4G0)不带emmc 系统镜像ubuntu-22.04.2-desktop-arm64-lubancat-4.img 网络环境:有线网络与本win10电脑同意环境 操作步骤ubuntu正常开机登陆用户&#xff0c;连接好网络进入设置>网络查看设备当前局域网IP 如192.168.199.159进入设置>共享>远程…

MAUI+Blazor:隐藏标题栏和问题

文章目录 前言相关文章代码问题有必要解决吗&#xff1f; 前言 最近在研究MAUIBlazor开发&#xff0c;发现一个问题&#xff0c;原生的的标题栏实在是太丑了。 相关文章 MAUI桌面端标题栏设置和窗口调整 MAUI Windows How to completely hide the TitleBar? #15142 MAUI …

Actuator微服务信息完善-Eureka—SpringCloud(版)微服务学习教程(11)

一、Actuator是什么&#xff1f; Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块&#xff0c;借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 在Springboot中使用Actuator监控非常简单&#xff0c;只需要在工程POM文件中引入…

Unity 射线检测

文章目录 1. 定义2. 重要类和方法2.1 Ray2.2 从屏幕发出射线&#xff1a;2.3 Raycast2.4 RaycastAll2.5 RaycastHit 碰撞信息2.6 layerMask 让射线检测只检测指定层级的对象 1. 定义 在Unity中&#xff0c;射线检测&#xff08;Raycasting&#xff09;是一种常用的技术&#x…

计网第一章

注意&#xff1a;计网知识点十分多&#xff0c;在本篇及后续博客主要记录个人认为比较重要的知识点。 1.计算机网络的基本概念 计算机网络就是自治的计算机互连起来的集合。计算机网络可以简称为网络&#xff0c;而互连网就是把许多网络连接起来&#xff0c;即网络的网络。 …

Linux发行版连接数位板手写板以后映射方向不对?

首先查看连接的设备&#xff1a; xinput list 如果像下图这样&#xff0c;鼠标类设备里面没有&#xff0c;只有键盘设备里面有你的数位板&#xff0c;那你就拿着笔到数位板上面比划比划&#xff0c;然后点一点笔上的按键&#xff0c;这样就能识别笔和按住按钮时候橡皮了。 比划…

每期一个小窍门: 玩转go mod 命令

看完本期小窍门 你将学会 go下载/更新 包的命令如何挎包调用/路径名称约定init()函数的作用和一些细节 本文涉及到的目录结构如下 关于 go.mod go.sum 这个demo依赖 github.com/bytedance/sonic 可以使用下面两个命令来确保依赖正常加载 go get github.com/bytedance/son…

【5G 核心网】5G 多PDU会话锚点技术介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

HRS--人力资源系统(Springboot+vue)(一)配置环境--登录篇

原谅我的三心二意&#xff0c;心血来潮写一个人力资源系统练练手 一上来就报错&#xff0c;老天待我不薄&#xff0c;手中拳头紧握。。。 问题一&#xff1a;这个错误头疼&#xff0c;推测是因为用了是新建的springboot maven项目是springboot3.0以上要jdk17以上等导致的&#…

Labview解决“重置VI:xxx.vi”报错问题

文章目录 前言一、程序框图二、前面板三、问题描述四、解决办法 前言 在程序关闭前面板的时候小概率型出现了 重置VI&#xff1a;xxx.vi 这个报错&#xff0c;并且发现此时只能通过任务管理器杀掉 LabVIEW 进程才能退出&#xff0c;这里介绍一下解决方法。 一、程序框图 程序…

连接不上手机,adb devices为空:

首先说明一下&#xff0c;我是已经安装了android studio,也配置了环境变量&#xff0c;但是还是连接不上手机 解决方案&#xff1a; 1.打开开发者模式 https://product.pconline.com.cn/itbk/sjtx/sjwt/1424/14246015.html 2.开启usb调试 https://baiyunju.cc/10770 最后成功…