LeetCode 熱題 100 54. 螺旋矩陣

LeetCode 熱題 100 | 54. 螺旋矩陣

大家好,今天我們來解決一道經典的算法題——螺旋矩陣。這道題在LeetCode上被標記為中等難度,要求我們按照順時針螺旋順序返回矩陣中的所有元素。下面我將詳細講解解題思路,并附上Python代碼實現。


問題描述

給定一個 mn 列的矩陣 matrix,請按照順時針螺旋順序,返回矩陣中的所有元素。

示例1:

輸入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出: [1,2,3,6,9,8,7,4,5]

示例2:

輸入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

解題思路

核心思想
  1. 邊界模擬法

    • 定義矩陣的四個邊界:上邊界 top、下邊界 bottom、左邊界 left、右邊界 right
    • 按照順時針方向(右→下→左→上)依次遍歷矩陣的邊界,并不斷調整邊界。
  2. 遍歷順序

    • 從左到右遍歷上邊界,完成后上邊界下移。
    • 從上到下遍歷右邊界,完成后右邊界左移。
    • 從右到左遍歷下邊界,完成后下邊界上移。
    • 從下到上遍歷左邊界,完成后左邊界右移。
  3. 終止條件

    • 當所有元素都被遍歷時(即 top > bottomleft > right),停止遍歷。

Python代碼實現

def spiralOrder(matrix):if not matrix:return []top, bottom = 0, len(matrix) - 1left, right = 0, len(matrix[0]) - 1result = []while top <= bottom and left <= right:# 從左到右遍歷上邊界for i in range(left, right + 1):result.append(matrix[top][i])top += 1# 從上到下遍歷右邊界for i in range(top, bottom + 1):result.append(matrix[i][right])right -= 1# 檢查是否還有下邊界需要遍歷if top <= bottom:# 從右到左遍歷下邊界for i in range(right, left - 1, -1):result.append(matrix[bottom][i])bottom -= 1# 檢查是否還有左邊界需要遍歷if left <= right:# 從下到上遍歷左邊界for i in range(bottom, top - 1, -1):result.append(matrix[i][left])left += 1return result# 測試示例
matrix1 = [[1,2,3],[4,5,6],[7,8,9]]
matrix2 = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]print(spiralOrder(matrix1))  # 輸出: [1,2,3,6,9,8,7,4,5]
print(spiralOrder(matrix2))  # 輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

代碼解析

  1. 初始化邊界

    • topbottom 分別表示矩陣的上下邊界。
    • leftright 分別表示矩陣的左右邊界。
  2. 順時針遍歷

    • 從左到右:遍歷上邊界,完成后將 top 下移。
    • 從上到下:遍歷右邊界,完成后將 right 左移。
    • 從右到左:遍歷下邊界(需檢查 top <= bottom),完成后將 bottom 上移。
    • 從下到上:遍歷左邊界(需檢查 left <= right),完成后將 left 右移。
  3. 終止條件

    • top > bottomleft > right 時,說明所有元素已被遍歷。

復雜度分析

  • 時間復雜度:O(m × n),其中 m 是矩陣的行數,n 是矩陣的列數。我們需要遍歷矩陣中的每個元素一次。
  • 空間復雜度:O(1),除了輸出結果外,只使用了常數個額外空間。

示例運行

示例1
輸入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出: [1,2,3,6,9,8,7,4,5]
示例2
輸入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

進階:其他解法

方法一:遞歸法
def spiralOrder_recursive(matrix):if not matrix:return []result = []rows, cols = len(matrix), len(matrix[0])def helper(top, bottom, left, right):if top > bottom or left > right:return# 從左到右遍歷上邊界for i in range(left, right + 1):result.append(matrix[top][i])top += 1# 從上到下遍歷右邊界for i in range(top, bottom + 1):result.append(matrix[i][right])right -= 1# 檢查是否還有下邊界需要遍歷if top <= bottom:# 從右到左遍歷下邊界for i in range(right, left - 1, -1):result.append(matrix[bottom][i])bottom -= 1# 檢查是否還有左邊界需要遍歷if left <= right:# 從下到上遍歷左邊界for i in range(bottom, top - 1, -1):result.append(matrix[i][left])left += 1helper(top, bottom, left, right)helper(0, rows - 1, 0, cols - 1)return result
  • 時間復雜度:O(m × n)
  • 空間復雜度:O(min(m, n)),遞歸調用的棧空間。

總結

通過使用邊界模擬法,我們可以高效地按照順時針螺旋順序遍歷矩陣中的所有元素。這種方法直觀且易于實現,適合大多數場景。希望這篇題解對大家有所幫助,如果有任何問題,歡迎在評論區留言討論!

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

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

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

相關文章

生成式AI將重塑的未來工作

在人類文明的長河中,技術革命始終是推動社會進步的核心動力。從蒸汽機的轟鳴到互聯網的浪潮,每一次技術躍遷都在重塑著人類的工作方式與生存形態。而今,生成式人工智能(Generative AI)的崛起,正以超越以往任何時代的速度與深度,叩響未來工作范式變革的大門。這場變革并非…

【2025軟考高級架構師】——2024年05月份真題與解析

摘要 本文內容是關于2025年軟考高級架構師考試的相關資料&#xff0c;包含2024年05月份真題與解析。其中涉及體系結構演化的步驟、OSI協議中能提供安全服務的層次、數據庫設計階段中進行關系反規范化的環節等知識點&#xff0c;還提及了軟考高級架構師考試的多個模塊&#xff…

KAG:通過知識增強生成提升專業領域的大型語言模型(三)

目錄 摘要 Abstract 1 Schema 2 Prompt 3 KAG-Builder 3.1 reader 3.2 splitter 3.3 extractor 3.4 vectorizer 3.5 writer 3.6 可選組件 4 示例 總結 摘要 本周深入學習了 KAG 項目中的 Schema、Prompt 以及 KAG-Builder 相關代碼知識&#xff0c;涵蓋了其定義、…

Gitea windows服務注冊,服務啟動、停止、重啟腳本

修改配置文件 查看COMPUTERNAME echo %COMPUTERNAME%進入配置文件D:\gitea\custom\conf\app.ini&#xff0c;將 Gitea 設置為以本地系統用戶運行 如果結果是 USER-PC&#xff0c;那么 RUN_USER USER-PC$ RUN_USER COMPUTERNAME$SQLite3 PATH配置&#xff0c;更改為包含完整…

礦泉水瓶的繪制

1.制作中心矩形&#xff0c;大小為60&#xff0c;注意設置矩形的兩條邊相等 2.點擊拉伸&#xff0c;高度為150mm 3.使用圓角命令&#xff0c;點擊連接到開始面&#xff0c;同時選中4條邊&#xff0c;進行圓角轉化&#xff0c;圓角大小為10mm&#xff0c;點擊多半徑圓角&#xf…

【程序+論文】大規模新能源并網下的火電機組深度調峰經濟調度

目錄 1 主要內容 講解重點 2 講解視頻及代碼 1 主要內容 該視頻為《大規模新能源并網下的火電機組深度調峰經濟調度》代碼講解內容&#xff0c;該程序有完全對照的論文&#xff0c;以改進IEEE30節點作為研究對象&#xff0c;系統包括5個火電機組和2個新能源機組&#xff0c;…

??工業機器人智能編程:從示教器到AI自主決策??

工業機器人智能編程:從示教器到AI自主決策 引言 工業機器人作為智能制造的核心裝備,其編程方式正經歷革命性變革。傳統示教器編程效率低下,平均每個路徑點需要30秒人工示教,而復雜軌跡編程可能耗時數周。隨著AI技術的發展,工業機器人編程正朝著"所見即所得"的…

n8n 構建一個 ReAct AI Agent 示例

n8n 構建一個 ReAct AI Agent 示例 0. 引言1. 詳細步驟創建一個 "When Executed by Another Workflow"創建一個 "Edit Fields (Set)"再創建一個 "Edit Fields (Set)"創建一個 HTTP Request創建一個 If 節點在 true 分支創建一個 "Edit Fiel…

Monorepo項目多項目一次性啟動工具對比與實踐

Monorepo項目多項目一次性啟動工具對比與實踐 在現代軟件開發中&#xff0c;Monorepo&#xff08;單一倉庫&#xff09;模式越來越受到開發者的青睞。Monorepo將多個相關的項目或包集中在一個倉庫中進行管理&#xff0c;方便依賴共享、代碼復用和統一發布。在Monorepo項目開發…

筆記整理六----OSPF協議

OSPF 動態路由的分類&#xff1a; 1.基于網絡范圍進行劃分--將網絡本身劃分為一個個AS&#xff08;自治系統---方便管理和維護&#xff09; 內部網關協議---負責AS內部用戶之間互相訪問使用的協議 IGP--RIP EIGRP ISIS OSPF 外部網關協議--負責AS之間&#xff08;整個互聯網&…

網絡編程,使用select()進行簡單服務端與客戶端通信

這里在Ubuntu環境下演示 一般流程 服務端常用函數&#xff1a; socket()&#xff1a;創建一個新的套接字。bind()&#xff1a;將套接字與特定的IP地址和端口綁定。listen()&#xff1a;使套接字開始監聽傳入的連接請求。accept()&#xff1a;接受一個傳入的連接請求&#xff…

智能決策支持系統的基本概念與理論體系

決策支持系統是管理科學的一個分支&#xff0c;原本與人工智能屬于不同的學科范疇&#xff0c;但自20世紀80年代以來&#xff0c;由于專家系統在許多方面取得了成功&#xff0c;于是人們開始考慮把人工智能技術用于計算機管理中來。在用計算機所進行的各種管理中&#xff0c;如…

驅動開發系列55 - Linux Graphics QXL顯卡驅動代碼分析(二)顯存管理

一:概述 前面介紹了當內核檢測到匹配的PCI設備后,會調用 qxl_pci_probe 初始化設備,其中會調用qxl_device_init 來初始化設備,為QXL設備進行內存映射,資源分配,環形緩沖區初始化,IRQ注冊等操作,本文展開說說這些細節,以及介紹下QXL的顯存管理。 二:QXL設備初始化細節…

洛谷 P1495:【模板】中國剩余定理(CRT)/ 曹沖養豬

【題目來源】 https://www.luogu.com.cn/problem/P1495 https://www.acwing.com/problem/content/225/ 【題目描述】 自從曹沖搞定了大象以后&#xff0c;曹操就開始捉摸讓兒子干些事業&#xff0c;于是派他到中原養豬場養豬。可是曹沖滿不高興&#xff0c;于是在工作中馬馬虎…

配置和使用持久卷

配置和使用持久卷 文章目錄 配置和使用持久卷[toc]一、PV與PVC的持久化存儲機制二、PV和PVC的生命周期三、創建基于NFS的PV1.準備NFS共享目錄2.創建PV 四、基于PVC使用PV1.創建PVC2.使用PVC 五、基于StorageClass實現動態卷制備1.獲取NFS服務器的連接信息2.獲取nfs-subdir-exte…

FreeRTOS菜鳥入門(十)·消息隊列

目錄 1. 基本概念 2. 數據存儲 3. 運作機制 4. 阻塞機制 4.1 出隊阻塞 4.2 入隊阻塞 5. 操作示意圖 5.1 創建隊列 5.2 向隊列發送第一個消息 5.3 向隊列發送第二個消息 5.4 從隊列讀取消息 6. 消息隊列控制塊 7. 消息隊列常用函數 7.1 消息隊列創建…

java 洛谷題單【算法2-2】常見優化技巧

P1102 A-B 數對 解題思路 輸入讀取與初始化&#xff1a; 使用 Scanner 讀取輸入。n 表示數組的長度&#xff0c;c 表示目標差值。使用一個 HashMap 存儲數組中每個數字及其出現的次數&#xff0c;方便快速查找。數組 a 用于存儲輸入的數字。 構建哈希映射&#xff1a; 遍歷數…

視頻轉GIF

視頻轉GIF 以下是一個使用 Python 將視頻轉換為 GIF 的腳本&#xff0c;使用了 imageio 和 opencv-python 庫&#xff1a; import cv2 import imageio import numpy as np """將視頻轉換為GIF圖參數:video_path -- 輸入視頻的路徑gif_path -- 輸出GIF的路徑fp…

計算機網絡:詳解TCP協議(四次握手三次揮手)

目錄 1.Tcp協議介紹 1.1 Tcp協議層級 1.2 TCP協議的格式 2. 確認應答機制 2.1 確認應答 2.2 序號字段 2.3 捎帶應答 3. 流量控制 4. 三次握手 四次揮手 4.1 認識標志位 4.2 簡單認識 4.3 三次揮手 4.4 四次揮手 1.Tcp協議介紹 1.1 Tcp協議層級 計算機網絡&#x…

小程序 IView WeappUI組件庫(簡單增刪改查)

IView Weapp 微信小程序UI組件庫&#xff1a;https://weapp.iviewui.com/components/card IView Weapp.png 快速上手搭建 快速上手.png iView Weapp 的代碼 將源代碼下載下來&#xff0c;然后將dict放到自己的項目中去。 iView Weapp 的代碼.png 小程序中添加iView Weapp 將di…