這道題之前在代碼隨想錄里刷過類似的,還有印象,我就按照當初代碼隨想錄的思路做了一下,結果怎么都做不對,因為按照代碼隨想錄的邊界條件設置,當行數和列數都為奇數時,最后一個元素無法被添加到數組中,搞得很傷腦筋,然后我看了下靈神的代碼,感覺還是有點太難懂了,我感覺Krahets大佬的代碼思想和我的比較貼合,而且也比較好懂,我就直接采用他的思路了。他的思路比較樸素,就是按照上-->右-->下-->左
的順序遍歷矩陣,然后將遍歷到的元素添加到數組中,但是這個思路中是遍歷一條邊后就立刻更新對應的邊界,例如,剛剛把上邊界的所有元素添加到數組后,就立刻將上邊界+1,然后遍歷右邊的邊時,右邊是直接從更新后的上邊界為起點開始遍歷的(這就意味著在同一圈中,上邊界添加的元素一定比下邊界添加的多,右邊界添加的元素一定比左邊界添加的多),另外,只要當前的下標值 <=
或者 >=
對應的邊界值,我們就無腦添加,為了避免重復添加的問題,我們就需要在更新完邊界以后立即判斷上下邊界有沒有交錯(up < down
),左右邊界有沒有交錯(left > right
),如果出現了這樣的情況,就說明已經打印完了所有元素,無需再繼續遍歷,直接退出當前的循環。
在退出循環之后,直接返回數組即可。
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> result;int up, right, down, left; //上下左右四個邊界up = 0;right = matrix[0].size() - 1;down = matrix.size() - 1;left = 0;while(up <= down && left <= right){//上for(int i = left; i <= right; ++i)result.emplace_back(matrix[up][i]);if(++up > down) break; //添加結束//右for(int i = up; i <= down; ++i)result.emplace_back(matrix[i][right]);if(--right < left) break; //添加結束//下for(int i = right; i >= left; --i)result.emplace_back(matrix[down][i]);if(--down < up) break; //添加結束//左for(int i = down; i >= up; --i)result.emplace_back(matrix[i][left]);if(++left > right) break;}return result; }
};