LeetCode 熱題 100 48. 旋轉圖像

LeetCode 熱題 100 | 48. 旋轉圖像

大家好,今天我們來解決一道經典的算法題——旋轉圖像。這道題在LeetCode上被標記為中等難度,要求我們將一個 n × n 的二維矩陣(圖像)順時針旋轉90度,并且必須原地修改矩陣,不能使用額外的矩陣空間。下面我將詳細講解解題思路,并附上Python代碼實現。


問題描述

給定一個 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]]

解題思路

核心思想
  1. 轉置 + 反轉

    • 首先對矩陣進行轉置(即行變列,列變行)。
    • 然后對每一行進行反轉,即可得到順時針旋轉90度的結果。
  2. 原地操作

    • 直接在原矩陣上進行轉置和反轉操作,不需要額外的空間。

Python代碼實現

def rotate(matrix):n = len(matrix)# 轉置矩陣for i in range(n):for j in range(i, n):matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]# 反轉每一行for i in range(n):matrix[i].reverse()# 測試示例
matrix1 = [[1,2,3],[4,5,6],[7,8,9]]
matrix2 = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]rotate(matrix1)
rotate(matrix2)print(matrix1)  # 輸出: [[7,4,1],[8,5,2],[9,6,3]]
print(matrix2)  # 輸出: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

代碼解析

  1. 轉置矩陣

    • 使用雙重循環遍歷矩陣的上三角部分(i0n-1jin-1)。
    • 交換 matrix[i][j]matrix[j][i],實現轉置。
  2. 反轉每一行

    • 使用 reverse() 方法對每一行進行反轉。
  3. 原地操作

    • 直接在原矩陣上進行轉置和反轉,不需要額外的空間。

復雜度分析

  • 時間復雜度:O(n2),其中 n 是矩陣的行數(或列數)。我們需要遍歷矩陣的每一個元素進行轉置和反轉。
  • 空間復雜度:O(1),只使用了常數個額外空間。

示例運行

示例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]]

進階:其他解法

方法一:四角旋轉
def rotate_four_corners(matrix):n = len(matrix)for i in range(n // 2):for j in range(i, n - 1 - i):# 保存左上角的值temp = matrix[i][j]# 左下角 → 左上角matrix[i][j] = matrix[n - 1 - j][i]# 右下角 → 左下角matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]# 右上角 → 右下角matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]# 左上角 → 右上角matrix[j][n - 1 - i] = temp# 測試示例
matrix1 = [[1,2,3],[4,5,6],[7,8,9]]
matrix2 = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]rotate_four_corners(matrix1)
rotate_four_corners(matrix2)print(matrix1)  # 輸出: [[7,4,1],[8,5,2],[9,6,3]]
print(matrix2)  # 輸出: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
  • 時間復雜度:O(n2)
  • 空間復雜度:O(1)

總結

通過使用轉置 + 反轉的方法,我們可以高效地將矩陣順時針旋轉90度,并且原地修改矩陣。這種方法直觀且易于實現,適合大多數場景。希望這篇題解對大家有所幫助,如果有任何問題,歡迎在評論區留言討論!

關注我,獲取更多算法題解和編程技巧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81649.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81649.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81649.shtml

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

相關文章

嵌入式按鍵原理、中斷過程與中斷程序設計(鍵盤掃描程序)

按鍵去抖動 ? 通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,電壓信號波型如下圖。由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動。…

數據結構之哈夫曼樹

8.哈夫曼樹 8.1 哈夫曼編碼 哈夫曼編碼(Huffman Coding),又稱霍夫曼編碼,是一種可變字長編碼(VLC)方式 這種編碼方法完全依據字符出現的概率來構造異字頭的平均長度最短的碼字, 因此有時也被…

機器學習實操 第一部分 機器學習基礎 第5章 支持向量機(SVM)

機器學習實操 第一部分 機器學習基礎 第5章 支持向量機(SVM) 內容概要 第5章深入介紹了支持向量機(SVM),這是一種功能強大且應用廣泛的機器學習模型。SVM適用于線性或非線性分類、回歸以及 novelty detection。本章詳…

Webug4.0靶場通關筆記14- 第18關 文件上傳之Nginx解析缺陷

目錄 第18關 滲透實戰 1.打開靶場 2.構造php腳本 3.源碼分析 (1)客戶端源碼 (2)服務的源碼 4.Nginx解析法滲透 (1)缺陷原因 (2)缺陷條件 (3)構造腳…

【QT】QT中的網絡編程(TCP 和 UDP通信)

QT中的網絡編程(TCP 和 UDP通信) 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服務器流程:1.2.1.1 示例代碼1.2.1.2 現象 1.2.2 客戶端流程:1.2.2.1 示例代碼1.2.2.2 現象: …

架構思維:使用懶加載架構實現高性能讀服務

文章目錄 一、引言二、讀服務的功能性需求三、兩大基本設計原則1. 架構盡量不要分層2. 代碼盡可能簡單 四、實戰方案:懶加載架構及其四大挑戰五、改進思路六、總結與思考題 一、引言 在任何后臺系統設計中,「讀多寫少」的業務場景占據主流:瀏…

永磁同步電機控制算法--基于PI的位置伺服控制

一、原理介紹 永磁同步伺服系統是包含了電流環、速度環和位置環的三環控制系統。 伺服系統通過電流檢測電路和光電編碼器檢測電動機三相繞組電流和轉子位置θ,通過坐標變換,計算出轉矩電流分量iq和勵磁電流分量id。 位置信號指令與實際轉子位置信號的差…

linux系統線程實現原理淺析

背景 對進程和線程的理解,之前一直都是憑一些零碎不完整的信息在理解; linux的進程和線程基本上一樣,線程是輕量級進程,彼此有關聯又獨立。 得虧內核支持的好,寫用戶態程序可以不依賴于實現的理解,只需要…

MySQL連接報錯處理:1130-host ... is not allowed to connect to this MySql server

在MySQL安裝完成后,很多開發者會遇到這樣一個問題: 錯誤代碼 1130:host xxx.xxx.xxx.xxx is not allowed to connect to this MySql server 這個錯誤通常出現在你嘗試通過遠程工具(如 Navicat、DBeaver 等)連接 MySQL …

Linux系統之----進程控制

1.進程創建 進程創建部分由于就是fork函數,還有寫時拷貝,在上一篇已經講述過了,這里不在進行贅述,有疑問的讀者可以前往上一篇博文《Linux系統--程序地址空間》中閱讀! 這里在多說一嘴寫時拷貝吧 我們可以對比一下寫…

Spring框架的設計目標,設計理念,和核心是什么 ?

Spring框架是一個為簡化企業級應用開發而設計的開源框架,它提供了全面的基礎設施支持,使得Java應用開發更加簡單、快速和可維護。下面我將詳細解釋Spring框架的設計目標、設計理念以及核心組件。 設計目標 簡化Java企業級應用開發:通過提供…

Red Hat6.4環境下搭建DNS服務器

DNS服務器(Domain Name System Server)是互聯網中用于將域名(如 www.example.com)解析為IP地址(如 192.0.2.1)的服務器。它是互聯網基礎設施的重要組成部分,幫助用戶通過易于記憶的域名訪問網站…

Nginx核心功能 02

目錄 Nginx代理技術核心概念 (一)正向代理(Forward Proxy) 1. 基本定義 2. 技術原理 3. 應用場景 (二)反向代理(Reverse Proxy) 1. 基本定義 2. 技術原理 3. 應用場景 一、…

關于Python:3. Python標準庫和常用模塊

1. os 和 sys(系統編程基礎) 這兩個模塊是進行系統層面操作(如文件管理、路徑處理、環境變量訪問等)必不可少的工具。 os 模塊 os 主要是用于與操作系統交互的,比如: 文件和目錄操作 獲取系統信息 運行…

Java基于SaaS模式多租戶ERP系統源碼

目錄 一、系統概述 二、開發環境 三、系統功能介紹 一、系統概述 ERP,全稱 Enterprise Resource Planning 即企業資源計劃。是一種集成化的管理軟件系統,它通過信息技術手段,將企業的各個業務流程和資源管理進行整合,以提高企業…

個人健康中樞的多元化AI網絡革新與精準健康路徑探析

引言 隨著數字化轉型的深入推進,個人健康中樞作為集成化健康管理系統,正在從傳統的單一功能向多元化的AI驅動方向快速發展。在這一背景下,新興網絡硬件技術,特別是DPU(數據處理單元)和全光網絡的出現,為個人健康中樞的革新提供了前所未有的機遇。本研究將深入探討這些技…

AI跑得快,MCP來加速——模型計算平臺在訓練與推理中的硬核作用

AI跑得快,MCP來加速——模型計算平臺在訓練與推理中的硬核作用 一、引言:AI是“鐵人三項”,但訓練+推理常常“掉鏈子” 如今的人工智能系統越來越強,像ChatGPT、Stable Diffusion、Segment Anything等模型不斷刷新技術天花板。但你是否也注意到: 明明模型設計得挺好,訓練…

《MATLAB實戰訓練營:從入門到工業級應用》工程實用篇-自動駕駛初體驗:車道線檢測算法實戰(MATLAB2016b版)

《MATLAB實戰訓練營:從入門到工業級應用》工程實用篇-🚗 自動駕駛初體驗:車道線檢測算法實戰(MATLAB2016b版) 大家好!今天我要帶大家一起探索自動駕駛中一個非常基礎但又至關重要的技術——車道線檢測。我…

模型部署——cuda編程入門

CUDA中的線程與線程束 kernel是在device上線程中并行執行的函數&#xff0c;核函數用__global__符號聲明&#xff0c;在調用時需要用<<<grid_size, block_size>>>來指定kernel要執行的線程數量。在CUDA中&#xff0c;每一個線程都要執行核函數&#xff0c;并…

WordPress不支持中文TAG標簽出現404的解決方法

我們在后臺編輯文章時輸入中文標簽會發現出現404的情況&#xff0c;其實中文TAG標簽鏈接無法打開的原因是WordPress不支持中文的編碼。那么解決的方法也很容易&#xff0c;只要改代碼讓WordPress能支持中文的編碼形式&#xff0c;也就是UTF-8和GBK編碼即可&#xff0c;無需用到…