這個解法很醜,而且一點也不 general,可是他可以提供我們一個切入點,從這個程式碼當中,隱約可以看出核心要注意的點就是每次輸出一個 row/col 時,i & j 的值和上下界。感覺好像可以用 up, down, left, right 來紀錄目前輸出的上下界,跟每次要輸出時,i or j 的值。
加入 up, down, left, right 後,我們得到一個這樣的解:
classSolution {public:vector<int> spiralOrder(vector<vector<int>>& matrix) { // Assume 3x3 only vector<int> res;int m =matrix.size();int n;if(m >0) n =matrix[0].size();int up=0, down=m-1, left=0, right=n-1; // Rightint i = up, j = left;for(; j<right+1; j++) res.push_back(matrix[i][j]); up++; j = right; // Downfor(i=up; i<down+1; i++) res.push_back(matrix[i][j]); right--; i = down; // Leftfor(j=right; j>=left; j--) {res.push_back(matrix[i][j]); } down--; j = left; // Upfor(i=down;i>=up; i--)res.push_back(matrix[i][j]); left++; i = up;for(auto k: res) cout << k <<" "; cout << endl;return res; }};/*// idea: m row, n col1st rown-th colmth row1-th col2nd rown-1 th colm-1 th row2nd col*/
這個實作雖然看起來很醜,不過很好地呈現了一次從 naive 到可以 work 的實作過程。而且跑起來時間效率也不錯:
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Spiral Matrix. Memory Usage: 8.6 MB, less than 39.69% of C++ online submissions for Spiral Matrix.