1. 程式人生 > >leetcode 54. Spiral Matrix

leetcode 54. Spiral Matrix

這裡寫圖片描述

 這題要求很簡單,就是將給定的矩陣按螺旋形返回,我在大一的時候做過這道題,如今在leetcode看到,也是種緣分吧。

 通過作圖我們可以發現,對於每個行數為m,列數為n的矩陣,螺旋的圈數不會超過m和n中的較小值。通過分析遍歷的順序和對應的圈數,我們可以得到一些對應關係,這將幫助我們確定遍歷的順序(通過標誌每次拐角的位置也可以達到同樣的效果)。特別需要注意的是,當我們在某個方向(螺旋的方向分為右,下,左,上)不能訪問任意一點的時候,說明我們已經遍歷完成了。這個時候不管圈數是多少,直接退出迴圈即可。

  程式碼如下:

class Solution {
public:
    vector
<int>
spiralOrder(vector<vector<int>>& matrix) { vector<int> result; if (matrix.empty()) return result; int m = matrix.size(); // 行數 int n = matrix[0].size(); // 列數 int count = 0; // 記錄已完成的圈數 int leftNum = m * n; int min = m < n ? m : n; while
(count < min) { // 向右 for (int i = count; i < n - count; i++) { result.push_back(matrix[count][i]); } // 一旦沒有點加進result,說明遍歷已經完成,每螺旋一條邊都要檢查一次 if (count >= n - count) break; // 向下 for (int i = count + 1
; i < m - count; i++) { result.push_back(matrix[i][n - count - 1]); } if (count + 1 >= m - count) break; // 向右 for (int i = n - count - 2; i >= count; i--) { result.push_back(matrix[m - count - 1][i]); } if (n - count - 2 < count) break; // 向上 for (int i = m - count - 2; i > count; i--) { result.push_back(matrix[i][count]); leftNum--; } if (m - count - 2 <= count) break; count++; } return result; } };