![这里写图片描述](https://img-blog.csdn.net/20171213213706489)
这题要求很简单,就是将给定的矩阵按螺旋形返回,我在大一的时候做过这道题,如今在leetcode看到,也是种缘分吧。
通过作图我们可以发现,对于每个行数为m,列数为n的矩阵,螺旋的圈数不会超过m和n中的较小值。通过分析遍历的顺序和对应的圈数,我们可以得到一些对应关系,这将帮助我们确定遍历的顺序(通过标志每次拐角的位置也可以达到同样的效果)。特别需要注意的是,当我们在某个方向(螺旋的方向分为右,下,左,上)不能访问任意一点的时候,说明我们已经遍历完成了。这个时候不管圈数是多少,直接退出循环即可。
代码如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result;
if (matrix.empty()) return result;
int m = matrix.size();
int n = matrix[0].size();
int count = 0;
int leftNum = m * n;
int min = m < n ? m : n;
while (count < min) {
for (int i = count; i < n - count; i++) {
result.push_back(matrix[count][i]);
}
if (count >= n - count) break;
for (int i = count + 1; i < m - count; i++) {
result.push_back(matrix[i][n - count - 1]);
}
if (count + 1 >= m - count) break;
for (int i = n - count - 2; i >= count; i--) {
result.push_back(matrix[m - count - 1][i]);
}
if (n - count - 2 < count) break;
for (int i = m - count - 2; i > count; i--) {
result.push_back(matrix[i][count]);
leftNum--;
}
if (m - count - 2 <= count) break;
count++;
}
return result;
}
};