【LeetCode熱題100道筆記】旋轉圖像

題目描述

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

提示:

n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000

思考一(轉置翻轉)

先轉置矩陣,再交換矩陣列

代碼

/*** @param {number[][]} matrix* @return {void} Do not return anything, modify matrix in-place instead.*/
var rotate = function(matrix) {const n = matrix.length;for (let i = 0; i < n; i++) {for (let j = 0; j < n; j++) {if (i <= j) {[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];}}}for (let i = 0; i < n; i++) {for (let j = 0; j < Math.floor(n/2); j++) {[matrix[i][j], matrix[i][n-j-1]] = [matrix[i][n-j-1], matrix[i][j]];}    }
};

思考二

分層旋轉(從外到內逐層處理),核心是通過 “臨時變量” 循環交換每一層的 4 個對應元素,同樣能實現原地旋轉。
將n×n矩陣看作“嵌套的正方形環”,從最外層(第0層)到最內層(第k層,k = Math.floor(n/2)),逐層處理每個環的元素:

  • 對于第 layer 層(從0開始),該層的“邊長”為 len = n - 2*layer,需要處理 len-1 組元素(每組4個元素對應旋轉后的位置)。

  • 每組元素的坐標規律(以第 layer 層為例):

    • 左上角元素:(layer, layer + offset) → 旋轉后到右上角;
    • 右上角元素:(layer + offset, n-1 - layer) → 旋轉后到右下角;
    • 右下角元素:(n-1 - layer, n-1 - layer - offset) → 旋轉后到左下角;
    • 左下角元素:(n-1 - layer - offset, layer) → 旋轉后到左上角;
    • offset 為每組的偏移量,從0到 len-2)。
  • 時間復雜度O(n2)O(n^2)O(n2)

代碼

const n = matrix.length;// 從外到內逐層處理,共 Math.floor(n/2) 層for (let layer = 0; layer < Math.floor(n / 2); layer++) {const len = n - 2 * layer; // 當前層的邊長const last = n - 1 - layer; // 當前層的最后一個索引(行/列相同)// 處理當前層的每一組4個元素(共 len-1 組)for (let offset = 0; offset < len - 1; offset++) {// 1. 保存左上角元素(臨時變量)const temp = matrix[layer][layer + offset];// 2. 左下角 → 左上角matrix[layer][layer + offset] = matrix[last - offset][layer];// 3. 右下角 → 左下角matrix[last - offset][layer] = matrix[last][last - offset];// 4. 右上角 → 右下角matrix[last][last - offset] = matrix[layer + offset][last];// 5. 左上角(臨時)→ 右上角matrix[layer + offset][last] = temp;}}

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

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

相關文章

SpringBoot【集成p6spy】使用p6spy-spring-boot-starter集成p6spy監控數據庫(配置方法舉例)

使用p6spy-spring-boot-starter集成p6spy監控數據庫1.簡單說明2.核心依賴3.主要配置4.簡單測試5.其他配置1.簡單說明 p6spy 類似于 druid 可以攔截 SQL 可以用于項目調試&#xff0c;直接引入 p6spy 的博文已經很多了&#xff0c;這里主要是介紹一下 springboot 使用 p6spy-sp…

擴散模型的優化過程,主要的公式推導,主要是熟悉一下整體的理論框架

核心思想與定義 擴散模型的核心思想是&#xff1a;學習一個去噪過程&#xff0c;以逆轉一個固定的加噪過程。前向過程&#xff08;固定&#xff09;&#xff1a; 定義一個馬爾可夫鏈&#xff0c;逐步向數據 x0~q(x0)\mathbf{x}_0 \sim q(\mathbf{x}_0)x0?~q(x0?) 添加高斯噪…

數字簽名、數字證書、數字信封的概念與區別

要理解數字簽名、數字證書、數字信封&#xff0c;核心是抓住它們各自的核心目標 —— 分別解決 “身份真實性與內容完整性”“公鑰可信度”“數據機密性” 問題&#xff0c;且三者都基于 “非對稱加密”&#xff08;一對公鑰、私鑰&#xff0c;公鑰公開、私鑰保密&#xff0c;用…

Day35 網絡協議與數據封裝

day35 網絡協議與數據封裝 數據封裝與協議結構 以太網MAC幀格式數據封裝與傳輸流程 數據在傳輸過程中&#xff0c;從上層逐層封裝到底層&#xff0c;最終通過物理介質發送。封裝與傳輸的具體流程如下&#xff1a; 封裝過程&#xff08;從IP層到物理層&#xff09; IP層&#xf…

Deeplizard深度學習課程(七)—— 神經網絡實驗

前言我們正在利用pytorch實現CNN。主要分為四個小部分&#xff1a;數據預處理、神經網絡pytorch設計、訓練神經網絡 和 神經網絡實驗。在之前的章節中&#xff0c;我們已經完成了整個CNN框架的設計、訓練與簡單分析&#xff0c;本節將更進一步討論神經網絡處理過程中的細節問題…

STM32實踐項目(激光炮臺)

剛開始設想做一個上半部分可以上下180移動,下半部分底座360移動的激光炮臺。于是便開始了實踐。 所需材料清單: 序號 名稱 數量 備注說明 1 面包板(Breadboard) 2 用于電路搭建和模塊連接 2 杜邦線(公對公、公對母等) 若干 建議準備 30~50 根,方便連接 3 MB-102 電源模塊…

不止是夾住,更是“感知”:Contactile GAL2觸覺型夾爪實現自適應抓取

近日&#xff0c;專注于觸覺傳感與智能抓取技術的Contactile推出全新Contactile 觸覺型夾爪 GAL2&#xff0c;這款集成先進傳感技術的雙指夾爪&#xff0c;憑借實時觸覺反饋能力&#xff0c;為多行業智能抓取場景帶來突破性解決方案。 Contactile 觸覺型夾爪GAL2是一款多功能即…

Grafana - 監控磁盤使用率Variables使用

1 查詢prometheus2 編輯grafana dashboard 2.1 配置變量2.2 配置多選2.3 配置legend2.4 優化顯示 1 查詢prometheus 指標名稱描述node_filesystem_size_bytes文件系統總容量node_filesystem_avail_bytes用戶可用空間node_filesystem_files_free剩余inode數量比如我們想看/目…

WindowsAPI|每天了解幾個winAPI接口之網絡配置相關文檔Iphlpapi.h詳細分析10

上一篇&#xff1a;WindowsAPI|每天了解幾個winAPI接口之網絡配置相關文檔Iphlpapi.h詳細分析9 如果有錯誤歡迎指正批評&#xff0c;在此只作為科普和參考。 C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um\iphlpapi.h 文章目錄GetNetworkParams&#xff1a…

算法 --- 分治(歸并)

分治&#xff08;歸并&#xff09; 分治&#xff08;特別是歸并&#xff09;算法適用于解決“整體求解依賴于子問題合并”且子問題相互獨立的題目&#xff0c;其典型特征是能將大規模數據分解、遞歸求解&#xff0c;然后通過合并操作&#xff08;這正是歸并排序中‘歸并’的精…

【程序人生】有夢想就能了不起,就怕你沒夢想

夢想不是遙不可及的星辰&#xff0c;而是需要我們用腳步丈量的路途兩年前的一個夏日&#xff0c;我在日記本上鄭重地寫下&#xff1a;"我要掌握Web開發&#xff0c;能夠獨立構建一個完整的Web應用。"那天是2023年6月8日&#xff0c;當時的我連Java和JavaScript都分不…

前端基礎(四十二):非固定高度的容器實現折疊面板效果

效果展示源碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…

發票、收據合并 PDF 小程序,報銷上傳 3 秒搞定

每到報銷、報稅、財務整理時&#xff0c;手里是不是總有一堆格式不一的票據&#xff1a; 聊天記錄里的電子發票郵件附件中的 PDF 發票手機相冊里的報銷收據甚至還有零散的紙質票據掃描件 要上傳或交給財務前&#xff0c;還得一個個整理、轉換、排版&#xff0c;既耗時又容易出…

GitHub每日最火火火項目(9.4)

1. bytebot-ai / bytebot 項目名稱&#xff1a;bytebot項目介紹&#xff1a;基于 TypeScript 開發&#xff0c;是一款自托管的 AI 桌面智能體&#xff0c;能通過自然語言命令自動化執行計算機任務&#xff0c;運行在容器化的 Linux 桌面環境中。它借助自然語言處理和 AI 技術&a…

MMORPG 游戲戰斗系統架構

&#x1f30c; MMORPG 游戲戰斗系統架構 引用&#xff1a; 游戲服務器同步技術解析&#xff08;C&#xff09;MMORPG移動同步與反外掛 雖然我已離開游戲行業&#xff0c;轉而與幾位成功的商人共同創業&#xff0c;投身于商用機器人領域&#xff0c;但坦誠地說&#xff0c;游戲…

【數學建模學習筆記】啟發式算法:蒙特卡洛算法

蒙特卡洛模擬入門筆記&#xff1a;從原理到代碼實踐一、什么是蒙特卡洛模擬&#xff1f;蒙特卡洛模擬是一種通過大量隨機實驗來解決復雜問題的方法。簡單說&#xff0c;就是用電腦模擬成千上萬次隨機事件&#xff0c;然后統計結果&#xff0c;以此估算一個問題的答案。舉個生活…

20250904的學習筆記

一、封包與拆包1. 封包&#xff08;Packet Encapsulation&#xff09;封包 是指在發送數據時&#xff0c;將數據從高層協議封裝到低層協議的過程。每經過一層協議&#xff0c;數據都會被加上相應的協議頭&#xff08;有時也會加上協議尾&#xff09;&#xff0c;形成一個新的數…

STM32F4 + RT-Thread 實戰指南:TIM10 硬件定時器驅動開發與 1 秒定時功能實現

目錄前言一、STM32定時器10是個什么定時器&#xff1f;二、工程創建、環境配置三、程序代碼四、運行前言 在rtthread中&#xff0c;STM32F4的定時器10有些驅動并不完整&#xff0c;對比與其它定時器在使用時需要手動的添加一些代碼&#xff0c;我在使用上拆踩了一些坑&#xf…

echarts圖庫

環形圖// 指定圖表的配置項和數據this.option {// tooltip: {// trigger: item// },color: [#FFB32F, #FF5757, #57D5FF, #2FA8FF, #95FFF1], // 扇形區域以及列表顏色legend: {orient:vertical,//文字橫向排itemGap:20,left: left,textStyle:{color: #F3F9FF,// fontSi…

進程(Process)全面概述

進程&#xff08;Process&#xff09;全面概述 本文檔擴展了進程的定義、屬性、生命周期、管理機制及示例&#xff0c;涵蓋 task_struct 結構、進程鏈表、狀態與優先級、fork 函數及其寫時復制示例。 一、進程基本概念 進程&#xff1a;系統進行資源分配和調度的基本單位&#…