1. 程式人生 > >【LeetCode】Spiral Matrix(螺旋矩陣)

【LeetCode】Spiral Matrix(螺旋矩陣)

這是LeetCode裡的第54道題。

題目要求:

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

核心思想:

無腦用迴圈,設定條件,並且注意邊界和圈數,進行合理的控制。走一圈如下圖所示:

可以發現,走完一圈以後每一行(列)的邊界都向裡壓縮了一個單位。所以主要處理好邊界和數的位置。

宣告right和down變數,代表右和下方向。取反則為反方向。因為取數先向右,後向下,後向左,最後向上。如此往復。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        /*
        vector<int>no;//這是為了返回空值而設定的變數
        if(matrix.size()==0)return no;//沒有資料返回空
        if(matrix[0].size()==0)return no;//雖然有行,但是每一行都沒資料,返回空
        */
        if (matrix.empty() || matrix[0].empty()) return {};//以上程式碼合併
        int n=matrix.size(),m=matrix[0].size();//n為行數,m為列數
        vector<int>res(n*m,0);//大小為n*m,並初始化為0的線性表
        int times=0;//記錄走了幾圈
        int right=1,down=1,i=0,j=0,ii=0,jj=0;
        for(ii=0;ii<n;ii++){
            for(jj=0;jj<m;jj++){
                res[ii*m+jj]=matrix[i][j];
                if(j<m-times&&i==times){
                    if(j==m-times-1){i=i+down;continue;}//判斷是否走到了邊界,下走
                    j=j+right;}//右走
                else if (i<n-times&&j==m-times-1){
                    if (i==n-times-1){j=j-right;continue;}//判斷是否走到了邊界,左走
                    i=i+down;}//下走
                else if(j>=0&&i==n-times-1){
                    if(j==times){i =i-down;continue;}//判斷是否走到了邊界,上走
                    j=j-right;}//左走
                else if(i>=0&&j==times){
                    if(i==times+1){j=j+right;times++;continue;}//判斷是否走到了邊界,右走
                    i=i-down;}//上走
            }
        }
        return res;
    }
};

執行結果:

個人總結: 

因為我之前寫過這個題目,所以做起來思路還是很清晰的,我個人認為,我這個演算法缺點在於判斷次數過多。不夠簡潔。之前是用的上下左右四個邊界設值來判斷拐彎條件。程式碼沒有那麼複雜也更好理解,而且這裡要求返回的結果是一維的陣列,而之前做的題目要求返回的是二維陣列,這道題難度降低了點。