天天看點

【LeetCode 中等題】27-螺旋矩陣聲明:正文結尾

聲明:

今天是中等題第27道題。給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,傳回矩陣中的所有元素。以下所有代碼經過樓主驗證都能在LeetCode上執行成功,代碼也是借鑒别人的,在文末會附上參考的部落格連結,如果侵犯了部落客的相關權益,請聯系我删除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,傳回矩陣中的所有元素。

示例 1:
輸入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
輸出: [1,2,3,6,9,8,7,4,5]
      
示例 2:
輸入:
[
  [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。設定上下左右4個限制,根據題意順時針周遊,按照左右-上下-右左-下上的順序周遊即可,然後四個限制逐漸向中間靠攏,代碼如下。

執行用時: 40 ms, 在Spiral Matrix的Python3送出中擊敗了99.16% 的使用者

class Solution:
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        if not matrix:
            return []
        m = len(matrix)
        n = len(matrix[0])
        up, left = 0, 0
        right, down = n-1, m-1
        res = []
        while True:    # 别擔心,while循環裡設定了break條件,周遊完畢肯定滿足break條件
            for i in range(left,right+1):
                res.append(matrix[up][i])
            up += 1
            if up > down:    # 上面的這行已經周遊完畢,up得+1,然後要判斷up有沒有越界,同理,下面3個for循環和if語句也是一樣的
                break

            for j in range(up,down+1):
                res.append(matrix[right][j])
            right -= 1
            if right < left:
                break

            for i in range(right,left-1,-1):
                res.append(matrix[down][i])
            down -= 1
            if down < up:
                break

            for j in range(down,up-1,-1):
                res.append(matrix[j][left])
            left += 1
            if left > right:
                break
        return res
           

結尾

解法1:https://www.cnblogs.com/grandyang/p/4362675.html