本题题目要求如下:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
我设定了4个变量:col_start, col_end, row_start, row_end来控制访问的元素,
下图说明其中一次循环的过程:
0代表初始状态:
1代表向右访问:结束后row_start + 1
2代表向下访问:结束后col_end - 1
3代表向左访问,结束后row_end - 1
4代表向上访问,结束后col_start + 1
因为修改4个变量存在滞后性,所以需要在每次改变方向的时候做判断是否已经访问了所有的元素,如果是,则跳出:
比如数组[1,2,3,4]在顺序访问1,2,3,4后如果不做判断,则row_end不变,仍然会向左访问。。
下面上代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
if (matrix.size() == 0)
return res;
int m = matrix.size();
int n = matrix[0].size();
int col_start = 0;
int col_end = n - 1;
int row_start = 0;
int row_end = m - 1;
int level = 0;
while (true) {
/* go right */
for (int i = col_start; i <= col_end; ++i)
res.push_back(matrix[row_start][i]);
row_start += 1;
if (res.size() == m * n)
break;
/* go down */
for (int j = row_start; j <= row_end; ++j)
res.push_back(matrix[j][col_end]);
col_end -= 1;
if (res.size() == m * n)
break;
/* go left */
for (int i = col_end; i >= col_start; --i)
res.push_back(matrix[row_end][i]);
row_end -= 1;
if (res.size() == m * n)
break;
/* go up */
for (int j = row_end; j >= row_start; --j)
res.push_back(matrix[j][col_start]);
col_start += 1;
if (res.size() == m * n)
break;
}
return res;
}
};