旋轉圖像(旋轉矩陣)

原題鏈接

旋轉圖像備戰技術面試?力扣提供海量技術面試資源,幫助你高效提升編程技能,輕松拿下世界 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.pswp.cn/news/35651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35651.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win10中Docker安裝、構建鏡像、創建容器、Vscode連接實例

Docker方便一鍵構建項目所需的運行環境&#xff1a;首先構建鏡像(Image)。然后鏡像實例化成為容器(Container)&#xff0c;構成項目的運行環境。最后Vscode連接容器&#xff0c;方便我們在本地進行開發。下面以一個簡單的例子介紹在win10中實現&#xff1a;Docker安裝、構建鏡像…

Flutter BottomSheet 三段式拖拽

BottomSheetBehavior 追蹤 BottomSheet系統默認實現效果準備要實現的功能點&#xff1a;定義三段式狀態&#xff1a;BottomSheetBehavoir閥值定義1. 未達到滾動閥值&#xff0c;恢復狀態2. 達到滾動閥值&#xff0c;更新狀態 前面倒是有講過Android原生的BottomSheetBehavior&a…

Flask 框架集成Bootstrap

前面學習了 Flask 框架的基本用法&#xff0c;以及模板引擎 Jinja2&#xff0c;按理說可以開始自己的 Web 之旅了&#xff0c;不過在啟程之前&#xff0c;還有個重要的武器需要了解一下&#xff0c;就是著名的 Bootstrap 框架和 Flask 的結合&#xff0c;這將大大提高開發 Web …

國產數據庫-內核特性-低基數全局字典

國產數據庫-內核特性-StarRocks低基數全局字典 StarRocks2.0引入了低基數全局字典&#xff0c;可以通過全局字典將字符串的相關操作轉換成整型相關操作&#xff0c;大大提升查詢性能。 1、低基數字典 對于利用整型替代字符串進行處理&#xff0c;通常使用字典編碼進行優化。Sta…

人大金倉助力某大型金融機構業務系統異地容災優化升級

日前&#xff0c;人大金倉助力某大型金融機構應收賬款融資服務平臺異地容災項目順利上線&#xff0c;保證了平臺系統運行的連續性和數據安全&#xff0c;為充分發揮平臺的融資功能&#xff0c;緩解中小微企業融資難提供了強有力的保障。 “ 緩解中小微企業融資難 某大型金融機構…

【MySQL--->數據庫操作】

文章目錄 [TOC](文章目錄) 一、操作語句1.增2.刪3.改4.查5.備份 二、字符集與校驗規則 一、操作語句 1.增 語句格式:create database [if no exists]數據庫名[create_specification [,create_specification] …]; 中括號內是可選項,if no exists是指如果數據庫不存在就創建,存…

STM32 F103C8T6學習筆記7:雙機無線串口通信

今日嘗試配通倆個C8T6單片機之間的無線串口通信&#xff0c;文章提供原理&#xff0c;源碼&#xff0c;測試效果圖&#xff0c;測試工程下載&#xff1a; 目錄 傳輸不規范問題&#xff1a; 串口通信資源&#xff1a; 單個串口資源理解&#xff1a; 單片機串口資源&#xf…

Redis的單線程與多線程

Redis的核心處理邏輯一直都是單線程 有一些分支模塊是多線程(某些異步流程從4.0開始用的多線程&#xff0c;例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的刪除操作。網絡I/O解包從6.0開始用的是多線程;) 為什么是單線程 多線程多好啊可以利用多核優勢 官方給的解釋 …

UI自動化環境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自動化的項目&#xff0c;為此從環境搭建來從0到1&#xff0c;希望能夠幫助到你&#xff0c;同時也是自我的梳理。將按照如下進行開展&#xff1a; 1、python的下載、安裝&#xff0c;python環境變量的配置。 2、pycharm開發工具的下載安裝。 3、selenium的安裝。…

Leetcode34 在排序數組中查找元素的第一個和最后一個位置

給你一個按照非遞減順序排列的整數數組 nums&#xff0c;和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target&#xff0c;返回 [-1, -1]。 你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。 代碼&#xff1a; c…

如何使用 Go 獲取 URL 的參數,以及使用時的問題

Go 獲取 URL 參數也很容易&#xff0c;但是由于 Go 有嚴格的數據類型和錯誤管理&#xff0c;所以在使用時會些微有些復雜。所以本文不僅會講如何獲取 URL 的參數&#xff0c;也會講在使用時的一些問題。 首先假設 URL 是https://www.example.com/?keywordabc&id12。 其他…

java中函數式接口、Stream流、方法引用、junit單元測試、反射、注解

函數式接口&#xff1a; 在java中有且僅有一個抽象方法的接口稱為函數式接口&#xff0c;但是可以包含其它的默認的或靜態的方法。 格式&#xff1a; 修飾符 interface 接口名稱 {public abstract 返回值類型 方法名稱(可選參數);// 其他非抽象方法 }函數式接口&#xff1a;…

服務器安全維護注意事項有哪些?

服務器的安全關系著公司整個網絡以及所有數據的安全&#xff0c;我們該如何做好服務器后續的安全維護呢?河南億恩科技股份有限公司&#xff0c;專注服務器托管23年&#xff0c;不僅是國內專業的互聯網基礎應用服務提供商之一&#xff0c;還是國家工信部認定的綜合電信服務運營…

OpenJDK Maven 編譯出錯: package jdk.nashorn.internal.runtime.logging does not exist

前言 OpenJDK 1.8.0Maven 3.8.5TencentOS Server 3.1 錯誤信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project tour-common: Compilation failure: Compilation failure: [ERROR] /opt/tour-c…

JavaScript預編譯機制

變量預編譯 任何變量&#xff0c;如果未經聲明就賦值&#xff0c;此變量是屬于 window 的屬性&#xff0c;而且不會做變量提升&#xff0c;無論在哪個作用域內賦值。比如說直接寫 console.log(a)肯定會報錯&#xff0c;提示找不到 a。但如果直接寫 a 100就不會報錯&#xff0…

【Linux命令行與Shell腳本編程】第十九章 正則表達式

Linux命令行與Shell腳本編程 第十九章 正則表達式 文章目錄 Linux命令行與Shell腳本編程 第十九章 正則表達式九.正則表達式9.1.正則表達式基礎9.1.1.正則表達式的類型9.2.定義BRE模式9.2.1.普通文本9.2.2.特殊字符 9.2.3.錨點字符錨定行首^錨定行尾$組合錨點 9.2.4.點號字符\.…

funbox3靶場滲透筆記

funbox3靶場滲透筆記 靶機地址 https://download.vulnhub.com/funbox/Funbox3.ova 信息收集 fscan找主機ip192.168.177.199 .\fscan64.exe -h 192.168.177.0/24___ _/ _ \ ___ ___ _ __ __ _ ___| | __/ /_\/____/ __|/ __| __/ _ |/ …

SpringBoot復習(39)Servlet容器的自動配置原理

Servlet容器自動配置類為ServletWebServerFactoryAutoConfiguration 可以看到通過Import注解導入了三個配置類&#xff1a; 通過這個這三個配置類可以看出&#xff0c;它們都使用了ConditionalOnClass注解&#xff0c;當類路徑存在tomcat相關的類時&#xff0c;會配置一個T…

【數據結構?堆】序列和的前n小元素

題目描述 問題&#xff1a;序列和的前n小元素   給出兩個長度為n的有序表A和B, 在A和B中各任取一個, 可以得到 n^2 個和. 求這些和最小的n個。 輸入輸出格式 輸入格式&#xff1a; 輸入數據共三行。   第一行&#xff0c;一個整數值n &#xff08; n < 10^4 &#xff…

Linux系列:從0到1用Docker部署springboot項目

目錄 1.前提條件 2.編寫DockerFile鏡像文件 3.打包SpringBoot項目 4.通過軟件Xftp進行傳輸&#xff08;*&#xff09; 1.點擊“文件-新建”?編輯 5.操作遠程主機 1.docker構建 2.容器運行 6.容器的關閉和刪除 1.前提條件 Linux、docker、xftp的安裝、一臺可以訪問的遠…