【二刷代碼隨想錄】螺旋矩陣求解方法、推薦習題

一、求解方法?

(1)按點模擬路徑

? ? ? ? 在原有坐標的基準上,疊加 橫縱坐標 的變化值,求出下一位置,并按題完成要求。但需注意轉角的時機判斷,特別是最后即將返回上一出發點的位置。

(2)按層模擬路徑

? ? ? ? 在原有的形狀基礎上,畫出 上下左右 四根邊界線,按照順序完成畫圈。但需要關注單行或單列可能存在重復的情況,因此需在操作?邊界線時加上判定條件。

(3)心路歷程

? ? ? ? 最開始掌握的是 Carl 教的循環畫框類的思路,但是它的應用是在方形樣式,其中的 offset 和 中間元素處理對于方形圖案比較好處理,但是針對矩形樣式,我真的不知道要怎么改了。后改學其他思路,也就是上述兩種。

二、推薦例題

(1)方形樣式的螺旋矩陣

????????59. 螺旋矩陣 II

方法1:點模擬

class Solution {public int[][] generateMatrix(int n) {    int curNum = 1;int maxNum = n * n;int curRow = 0;int curCol = 0;int dirIndex = 0;int[][] dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};int[][] res = new int[n][n];while(curNum <= maxNum){res[curRow][curCol] = curNum++;//判定后續位置是否越界int nextRow = curRow + dirs[dirIndex][0];int nextCol = curCol + dirs[dirIndex][1];//需要加一個res[nextRow][nextCol] != 0 因為走了一圈之后就回到了原點,需要避免回原點,而是調整方向//比如三階矩陣中的最后9,若不調整方向,則會放到原點處if(nextRow < 0 || nextRow > n-1 || nextCol < 0 || nextCol > n-1 || res[nextRow][nextCol] != 0){dirIndex = (dirIndex+1) % 4;}curRow = curRow + dirs[dirIndex][0];curCol = curCol + dirs[dirIndex][1];}return res;}
}

方法2:層模擬

class Solution {public int[][] generateMatrix(int n) {    int left = 0;int right = n-1;int top = 0;int bottom = n-1;int num = 1;int[][] res = new int[n][n];while(left <= right && top <= bottom){//上:從左往右-----j 從 left ---> rightfor(int j = left; j <= right; j++){res[top][j] = num++;}top++;//右:從上到下-----i 從 top ---> bottomfor(int i = top; i <= bottom; i++){res[i][right] = num++;}right--;if(top <= bottom){//下:從右到左-----j 從 right ---> leftfor(int j = right; j >= left; j--){res[bottom][j] = num++;}bottom--;}if(left <= right){//左:從下到上-----i 從 bottom ---> topfor(int i = bottom; i >= top; i--){res[i][left] = num++;}left++;}}return res;}
}

方法3:“循環畫框”

class Solution {public int[][] generateMatrix(int n) {    int loopCur = 1;        //當前所處的圈數int loopCnt = n / 2;    //所需繪制的完整圈數int xStart = 0;         //橫坐標的開始坐標int yStart = 0;         //縱坐標的開始坐標int offset = 1;         //當前繪制圈的偏置值int num =  1;           //當前繪制的數字int i,j;                //繪制地圖用的橫縱坐標int[][] res = new int[n][n];while(loopCur <= loopCnt){//上:從左往右-----j 從 yStart ---> n-offsetfor(j = yStart; j < n-offset; j++){res[xStart][j] = num++;}//右:從上到下-----i 從 xStart ---> n-offsetfor(i = xStart; i < n-offset; i++){res[i][j] = num++;}//下:從右到左-----j 遞減到 yStart+1for(; j > yStart; j--){res[i][j] = num++;}//左:從下到上-----i 遞減到 xStart+1for(; i > xStart; i--){res[i][j] = num++;}offset++;   //調整偏置值loopCur++;xStart++;yStart++;}if(1 == n%2){res[xStart][yStart] = num;}return res;}
}

?(2)矩形樣式的螺旋矩陣

????????54.螺旋矩陣

方法1:點模擬

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();if(matrix == null){return res;}int rows = matrix.length;int cols = matrix[0].length;int cnt = rows * cols;if (rows == 0 || cols == 0) {return res;}int curRow = 0;int curCol = 0;int dirIndex = 0;int[][] dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};boolean[][] visited = new boolean[rows][cols];while(cnt > 0){res.add(matrix[curRow][curCol]);visited[curRow][curCol] = true;//判定后續位置是否越界int nextRow = curRow + dirs[dirIndex][0];int nextCol = curCol + dirs[dirIndex][1];//需要加一個res[nextRow][nextCol] != 0 因為走了一圈之后就回到了原點,需要避免回原點,而是調整方向//比如三階矩陣中的最后9,若不調整方向,則會放到原點處if(nextRow < 0 || nextRow > rows-1 || nextCol < 0 || nextCol > cols-1 || visited[nextRow][nextCol] != false){dirIndex = (dirIndex+1) % 4;}curRow = curRow + dirs[dirIndex][0];curCol = curCol + dirs[dirIndex][1];cnt--;}return res;}
}

方法2:層模擬

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();if(matrix == null){return res;}int rows = matrix.length;int cols = matrix[0].length;if (rows == 0 || cols == 0) {return res;}int top = 0;int bottom = rows -1;int left = 0;int right = cols -1;while(top <= bottom && left <= right){//上:從左到右for(int j = left; j <= right; j++){res.add(matrix[top][j]);}top++;//右:從上到下for(int i = top; i <= bottom; i++){res.add(matrix[i][right]);}right--;//下:從右到左if(top <= bottom){  //若不判斷,遇見單行,則會重復處理for(int j = right; j >= left;j--){res.add(matrix[bottom][j]);}}bottom--;//左:從下到上if(left <= right){  //若不判斷,遇見單列,則會重復處理for(int i = bottom; i >= top; i--){res.add(matrix[i][left]);}}left++;}return res;}
}

方法3:?“循環畫框”--錯誤代碼演示,沒改出來

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();int rows = matrix.length;int cols = matrix[0].length;int loopCur = 1;int loopCnt = rows/2 + 1;    //為便捷處理中心區域的多個數據int xStart = 0;int yStart = 0;int offset = 1;//因為增加了圈數,導致單行的矩陣會重復打印if(rows == 1){for(int temp = 0; temp < cols; temp++){res.add(Integer.valueOf(matrix[0][temp]));}return res;}//因為增加了圈數,導致單列的矩陣會重復打印if(cols == 1){for(int temp = 0; temp < rows; temp++){res.add(Integer.valueOf(matrix[temp][0]));}return res;}int i,j;while(loopCur <= loopCnt){//上:從左到右for(j = yStart; j < cols-offset; j++){res.add(matrix[xStart][j]); }//右:從上到下for(i = xStart; i < rows-offset; i++){res.add(matrix[i][j]);}//下:從右到左for(; j > yStart; j--){res.add(matrix[i][j]);}//左:從下到上for(; i > xStart; i--){res.add(matrix[i][j]);}offset++;loopCur++;xStart++;yStart++;}if(rows == cols && rows%2 ==1){res.add(matrix[xStart-1][yStart-1]);}return res;}
}

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

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

相關文章

從Manus到OpenManus:AI智能體技術如何重塑未來生活場景?

從Manus到OpenManus&#xff1a;AI智能體技術如何重塑未來生活場景&#xff1f; 一、現狀&#xff1a;AI智能體技術面臨的三大核心矛盾 &#xff08;通過分析用戶高頻痛點與市場反饋提煉&#xff09; 能力與門檻的失衡 Manus展示的復雜任務處理能力&#xff08;如股票分析、代…

迭代器與可迭代對象

概念層面&#xff1a; 可迭代對象&#xff1a; 一個可迭代對象是指任何可以返回一個迭代器的對象。換句話說&#xff0c;它實現了 __iter__() 方法 比如&#xff1a;列表、元組、字典、字符串、集合等 直接通過 for 循環使用&#xff0c;因為 for 循環內部會調用其 __iter__(…

總結PostgreSQL創建數據庫失敗的解決辦法

作者&#xff1a;朱金燦 來源&#xff1a;clever101的專欄 系統環境是Windows 11 專業版&#xff0c;PostgreSQL版本是17。在運行sql語句創建數據庫時出現錯誤&#xff1a; 閿欒: template database \"template1\" has a collation version mismatch DETAIL: Th…

Mybatis源碼 插件機制

簡介 插件是一種常見的擴展方式&#xff0c;大多數開源框架也都支持用戶通過添加自定義插件的方式來擴展或者改變原有的功能&#xff0c;MyBatis中也提供的有插件&#xff0c;雖然叫插件&#xff0c;但是實際上是通過攔截器(Interceptor)實現的&#xff0c;在MyBatis的插件模塊…

Android14 SystemUI中添加第三方AIDL

由于特殊需求&#xff0c;需要在SystemUI中添加第三方AIDL&#xff0c;去做一些客制化的修改。現在記錄一下AIDL添加的過程。 1.將AIDL文件拷貝到frameworks/base/packages/SystemUI/src/下&#xff0c;我要添加的AIDL文件是com/test/myctr/IDevicectr.aidl&#xff0c;添加后的…

Binlog、Redo log、Undo log的區別

一、binlog和redo log的區別 特性binlogredo log記錄對象記錄的是 MySQL 服務器的事務操作&#xff0c;針對的是整個數據庫實例。記錄的是 InnoDB 存儲引擎的數據頁變化&#xff0c;針對的是具體的存儲引擎層面。記錄內容記錄的是事務的邏輯操作&#xff0c;例如 SQL 語句&…

TDengine 中的異常恢復

簡介 本章主要介紹在 TDengine 執行命令過程中發生異常&#xff0c;如何手工終于執行的任務。可以終止連接&#xff0c;線上查詢及終止事務。 如果一個事務 在一個復雜的應用場景中&#xff0c;連接和查詢任務等有可能進入一種錯誤狀態或者耗時過長遲遲無法結束&#xff0c;…

全球化2.0 | ZStack舉辦香港Partner Day,推動AIOS智塔+DeepSeek海外實踐

2025年3月21日&#xff0c;云軸科技ZStack在香港成功舉辦了主題為“ZStack AIOS 智塔與 DeepSeek 私有化方案介紹及企業應用落地實踐”的 Partner Day 活動。此次活動吸引了眾多海外合作伙伴&#xff0c;共同探討 AI Infra 平臺在企業私有化 AI 中的應用與價值閉環。 ZStack CT…

ERP、MES和CRM三大企業系統的詳細介紹及對比分析

以下是關于ERP、MES和CRM三大企業系統的詳細介紹及對比分析&#xff1a; 1. ERP&#xff08;企業資源計劃&#xff0c;Enterprise Resource Planning&#xff09; 核心功能&#xff1a; 集成管理&#xff1a;財務、采購、庫存、生產、人力資源等核心業務流程資源優化&#xf…

(二十)Dart 中的多態

Dart 中的多態教程 一、多態的概念 多態是面向對象編程中的一個重要概念。它允許將子類類型的指針賦值給父類類型的指針&#xff0c;同一個函數調用會有不同的執行效果。換句話說&#xff0c;子類的實例可以賦值給父類的引用。多態的核心在于父類定義一個方法不去實現&#x…

【C++初階】第12課—list

文章目錄 1. list的構造2. list迭代器的常見接口2.1 list遍歷的迭代器接口2.2 list修改數據的迭代器接口2.3 list排序、逆序、合并相關操作的成員函數 3. 模擬實現list3.1 模擬實現list的構造3.2 模擬實現list的尾插3.3 模擬實現迭代器iterator3.4 模擬實現list的插入刪除3.5 模…

思維鏈技術(Chain-of-Thought, CoT)

思維鏈&#xff08;Chain-of-Thought, CoT&#xff09;是一種通過模擬人類逐步推理過程來提升大型語言模型&#xff08;LLM&#xff09;復雜任務表現的技術。其核心思想是讓模型在生成最終答案前&#xff0c;先輸出中間推理步驟&#xff0c;從而增強邏輯性和可解釋性。 1. 基礎…

谷粒微服務高級篇學習筆記整理---異步線程池

多線程回顧 多線程實現的4種方式 1. 繼承 Thread 類 通過繼承 Thread 類并重寫 run() 方法實現多線程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("線程運行: " Thread.currentThread().getName());} }// 使用 pub…

Windows學習筆記(4)關于MITRE

基本術語 APT&#xff08;威脅組&#xff0c;高級持續威脅&#xff09; TTP&#xff08;攻擊目的技術過程&#xff0c;戰術技術和程序&#xff09; ATT&CK框架 網站 https://attack.mitre.org/ CAR知識庫 MITRE Engage MITRE D3FEND 網址 https://d3fend.mitre.org/

Go 語言規范學習(2)

文章目錄 VariablesTypesBoolean typesNumeric typesString typesArray typesSlice typesStruct typesPointer typesFunction typesInterface typesBasic interfacesEmbedded interfacesGeneral interfaces【泛型接口】Implementing an interface【實現一個接口】 Map typesCha…

創意 Python 愛心代碼分享

創意 Python 愛心代碼分享 在編程中&#xff0c;用代碼表達創意和情感是一種非常有趣的方式。本文將分享幾段用 Python 編寫的愛心代碼&#xff0c;涵蓋簡單到復雜的實現方式&#xff0c;適合初學者和進階開發者。 1. 簡單愛心圖案 代碼實現 print("\n".join([&qu…

NLP高頻面試題(二十四)——RAG相關內容簡介

檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff0c;簡稱 RAG&#xff09;是一種將信息檢索與生成模型相結合的技術&#xff0c;旨在提升大型語言模型的響應準確性、相關性和時效性。通過在生成過程中引入外部知識&#xff0c;RAG 能夠有效彌補 LLM 在知識局限…

Share01-WinCC文件越用越大?

為什么你們的經典WinCC項目在客戶電腦上運行的越來越慢&#xff1f;為什么查詢一個歷史曲線慢的要死&#xff1f;為什么重啟一下電腦畫面都要懷疑人生&#xff1f;具體原因可能多種多樣&#xff0c;但是極大可能是您的數據管理設置欠佳&#xff0c;那么閑話少敘&#xff0c;和小…

練習題:111

目錄 Python題目 題目 題目分析 需求理解 關鍵知識點 實現思路分析 代碼實現 代碼解釋 指定文件路徑和名稱&#xff1a; 定義要寫入的內容&#xff1a; 打開文件并寫入內容&#xff1a; 異常處理&#xff1a; 輸出提示信息&#xff1a; 運行思路 結束語 Python題…

2025_0327_生活記錄

昨晚正在玩手機&#xff0c;凌晨一點二十一分左右手機突然響起來&#xff0c;通知地震波將在5秒后到達海淀區。看著倒計時的數字不斷減小&#xff0c;橙色預警頁面不斷閃動&#xff0c;床猛地搖了幾下。那一刻&#xff0c;我的記憶被拉回了2008年。 上大學之前我在成都生活了1…