54. 螺旋矩陣

【題目】

給你一個(gè) mn 列的矩陣 matrix ,請(qǐng)按照 順時(shí)針螺旋順序 ,返回矩陣中的所有元素。

示例 1:

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

示例 2:

image.png
輸入: 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]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

【題目解析】

解題方法

解決螺旋矩陣問(wèn)題的關(guān)鍵是模擬遍歷過(guò)程,維護(hù)四個(gè)變量leftright、top、bottom來(lái)表示當(dāng)前遍歷的邊界,并按順序遍歷四個(gè)邊界上的元素。通過(guò)逐漸縮小邊界,我們可以模擬整個(gè)順時(shí)針遍歷的過(guò)程。

  • 步驟一:從左到右遍歷上邊界的所有元素。
  • 步驟二:從上到下遍歷右邊界的所有元素。
  • 步驟三:如果適用,從右到左遍歷下邊界的所有元素。
  • 步驟四:如果適用,從下到上遍歷左邊界的所有元素。
  • 循環(huán)條件:每次遍歷完成后,相應(yīng)地縮小邊界,直到邊界不再重疊。
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix or not matrix[0]:
            return []
        
        rows, cols = len(matrix), len(matrix[0])
        left, right, top, bottom = 0, cols - 1, 0, rows - 1
        result = []
        
        while left <= right and top <= bottom:
            # 從左到右遍歷上層邊界
            for col in range(left, right + 1):
                result.append(matrix[top][col])
            # 從上到下遍歷右側(cè)邊界
            for row in range(top + 1, bottom + 1):
                result.append(matrix[row][right])
            if left < right and top < bottom:
                # 從右到左遍歷下層邊界
                for col in range(right - 1, left, -1):
                    result.append(matrix[bottom][col])
                # 從下到上遍歷左側(cè)邊界
                for row in range(bottom, top, -1):
                    result.append(matrix[row][left])
            left, right, top, bottom = left + 1, right - 1, top + 1, bottom - 1
        
        return result

執(zhí)行效率

image.png

【總結(jié)】

適用問(wèn)題類型

螺旋矩陣問(wèn)題屬于數(shù)組遍歷與矩陣操作的范疇,特別是在需要按照特定順序訪問(wèn)矩陣元素的場(chǎng)合。此類問(wèn)題廣泛出現(xiàn)在圖像處理、數(shù)據(jù)轉(zhuǎn)換、以及任何涉及二維數(shù)據(jù)結(jié)構(gòu)操作的領(lǐng)域中。

解決算法

  • 算法描述:模擬遍歷法通過(guò)模擬順時(shí)針螺旋的路徑來(lái)遍歷矩陣中的所有元素。算法核心在于動(dòng)態(tài)調(diào)整遍歷的邊界,即上下左右四個(gè)方向的界限,從而實(shí)現(xiàn)整個(gè)矩陣的順序遍歷。

  • 算法特點(diǎn)

    • 直觀性:該算法的邏輯簡(jiǎn)單直觀,易于理解和實(shí)現(xiàn)。
    • 靈活性:通過(guò)調(diào)整遍歷的方向和邊界條件,該方法可以應(yīng)用于不同形狀和大小的矩陣。
    • 無(wú)需額外空間:除了輸出結(jié)果所需的空間外,算法本身不需要額外的數(shù)據(jù)結(jié)構(gòu)。

時(shí)間復(fù)雜度與空間復(fù)雜度

  • 時(shí)間復(fù)雜度O(m*n),其中mn分別代表矩陣的行數(shù)和列數(shù)。算法需要遍歷矩陣中的每個(gè)元素一次。
  • 空間復(fù)雜度O(1),算法在遍歷過(guò)程中僅需維護(hù)幾個(gè)變量來(lái)記錄邊界和方向,因此空間復(fù)雜度為常數(shù)級(jí)別。

實(shí)踐意義

  • 廣泛應(yīng)用:模擬遍歷法不僅適用于螺旋矩陣問(wèn)題,還可以靈活應(yīng)用于其他需要特定順序訪問(wèn)數(shù)據(jù)的場(chǎng)景,如旋轉(zhuǎn)圖像、填充螺旋矩陣等。
  • 算法教學(xué):該問(wèn)題及其解法是教授數(shù)組和矩陣操作、掌握循環(huán)和邊界控制技巧的良好案例。
  • 編程技巧:掌握這種模擬遍歷的方法有助于提升解決實(shí)際問(wèn)題的能力,尤其是在處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)和算法設(shè)計(jì)時(shí)。

通過(guò)對(duì)螺旋矩陣問(wèn)題的深入分析,我們不僅能夠?qū)W習(xí)到如何有效地處理矩陣和數(shù)組中的數(shù)據(jù),還能夠理解到算法設(shè)計(jì)中的邊界控制和循環(huán)遍歷技巧,為解決更復(fù)雜的算法問(wèn)題打下堅(jiān)實(shí)的基礎(chǔ)。

題目鏈接

螺旋矩陣

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容