【LeetCode】Spiral Matrix(螺旋矩陣)
阿新 • • 發佈:2018-12-01
這是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; } };
執行結果:
個人總結:
因為我之前寫過這個題目,所以做起來思路還是很清晰的,我個人認為,我這個演算法缺點在於判斷次數過多。不夠簡潔。之前是用的上下左右四個邊界設值來判斷拐彎條件。程式碼沒有那麼複雜也更好理解,而且這裡要求返回的結果是一維的陣列,而之前做的題目要求返回的是二維陣列,這道題難度降低了點。