class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> res; int n = matrix.size(); // 特断是否有元素存在,不存在直接返回res if(!n) return res; int m = matrix[0].size(); if(!m) return res; // dx和dy分别代表向横坐标和纵坐标方向移动的幅度 // 当遍历到边界的时候需要变一下方向 int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; // M 将遍历过得元素赋值为M表示走过了 int M = INT_MAX - 1; int k = 0; int i = 0, j = 0; // 必须先判断i和j是否已经出界,在判断matrix[i][j],否则会产生segment out错误 // 当元素出界或是第二次遇到遍历过的元素,即为遍历到底 while(i >=0 && i < n && j >= 0 && j < m && matrix[i][j] != M) { int x = matrix[i][j]; matrix[i][j] = M; res.push_back(x); // 先判断三个边界条件 if(i + dx[k] == n || j + dy[k] == m || j + dy[k] == -1) k = (k + 1) % 4; // 后判断前一个元素是否走过,如果走过需要变一下方向 else if(matrix[i + dx[k]][j + dy[k]] == M) k = (k + 1) % 4; i = i + dx[k]; j = j + dy[k]; } return res; } };