该题目的详细内容如下截图:
分析:题目是想让我们将一个二维的矩阵按照螺旋的方式输出。如下图的描述所示:
(原谅我用word画的一个awful的图示)所以,不难想到应该可以在O(1)的时间复杂度内解决这个问题。
思路:
1,设置四个障碍,分别表示行起始下标,终止下标;列起始下标,终止下标。2,待输出的指示器触碰到任何一个障碍时,输出方向就做相应的改变,同时,需要重新调整障碍。调整规律如下:
- 1,碰到列的终止下标时,列的终止下标减一,方向改为竖直向下。
- 2,碰到列的起始下标时,列的起始下标加一,方向改为竖直向上。
- 3,碰到行的起始下标时,行的起始下标加一,方向改为水平向右。
- 4,碰到行的终止下标时,行的终止下标减一,方向改为水平向左。
3,上代码:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> fin;
if (matrix.size() == 0)
return fin;
int barricadeRow = 0, barricadeColumn = 0;
int upperboundRow = matrix.size() - 1, upperboundColumn = matrix[0].size() - 1;
int tar = 4;
for (int i = 0, j = -1, count = 0; count < matrix.size() * matrix[0].size(); count++)
{
if (i == barricadeRow&&tar==4)
{
barricadeRow++;
tar = 1;
}
else if (j == barricadeColumn&&tar==3)
{
barricadeColumn++;
tar = 4;
}
else if (i == upperboundRow&&tar==2)
{
upperboundRow--;
tar = 3;
}
else if (j == upperboundColumn&&tar==1)
{
upperboundColumn--;
tar = 2;
}
if (tar == 1)
j++;
else if (tar == 2)
i++;
else if (tar == 3)
j--;
else
i--;
fin.push_back(matrix[i][j]);
}
return fin;
}
4,运行结果(0ms也是够快的,哈哈)