1 题目描述
Given a matrix of
m x
n elements (
m rows,
n columns), return all elements of the matrix in spiral order.
题目难度:Medium
2 题目样例
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].
3 题意分析
给定一个矩阵,按照一个内卷螺旋型的顺序返回矩阵中的元素。
(说实话,当我把题目读完我就觉得这题很烂,因为感觉在思路上并无革新之处。)
4 思路分析
思路很直观,只要一张草稿纸就能理清。先向右,再向下,再向左,再向上。之后重复上述步骤。
例如对于一个5*3的矩阵,只需要进行下述步骤,即可得到一个螺旋型输出的矩阵:
- 向右走5格。
- 向下走2格。
- 向左走4格。
- 向上走1格。
- 向右走3格。
对于左右的移动,每次移动的格子数为5->4->3。
对于上下的移动,每次移动的格子数为2->1->0。
因此,我们可以利用方向矩阵记录所有方向的偏移量。然后使用两个元素的数组分别存储左右和上下的偏移数量。如此我们只需要使用一个循环(这是简化代码的最佳方式,按照常规写法,应该有4条循环语句)就能达到目的。
代码实现如下:
class Solution
{
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
vector<vector<int> > dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
vector<int> res;
int nr = matrix.size();
if (nr == 0)
return res;
int nc = matrix[0].size();
if (nc == 0)
return res;
vector<int> nSteps{nc, nr-1};
int iDir = 0;
int ir = 0, ic = -1;
while (nSteps[iDir%2])
{
for (int i = 0; i < nSteps[iDir%2]; ++i)
{
ir += dirs[iDir][0]; ic += dirs[iDir][1];
res.push_back(matrix[ir][ic]);
}
nSteps[iDir%2]--;
iDir = (iDir + 1) % 4;
}
return res;
}
};
5 后记
很奇怪的一件事是,我在用服务器代理的时候提交代码出现了Unknown error,但是在直接连接的时候则一切正常并且AC,为什么会这样呢?