每次横向(纵向)走到尽头调换方向,下次横向(纵向)经过的元素便减一个。
时间复杂度:O(M*N)
C++代码:
class Solution {
public:
enum dir { UP, DOWN, LEFT, RIGHT };
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.empty() || matrix[0].empty())
return {};
if (matrix.size() == 1)
return matrix[0];
vector<int> result;
for (auto x : matrix[0])
result.push_back(x);
int x = matrix[0].size() - 1, y = 0;
int col = matrix.size() - 1;
int row = matrix[0].size() - 1;
dir direct = DOWN;
while (col || row)
{
switch (direct)
{
case RIGHT:
{
for (int i = 0; i < row; i++)
result.push_back(matrix[y][++x]);
if (col == 0)
row = 1;
row--;
direct = DOWN;
break;
}
case DOWN:
{
for (int i = 0; i < col; i++)
result.push_back(matrix[++y][x]);
if (row == 0)
col = 1;
col--;
direct = LEFT;
break;
}
case LEFT:
{
for (int i = 0; i < row; i++)
result.push_back(matrix[y][--x]);
if (col == 0)
row = 1;
row--;
direct = UP;
break;
}
case UP:
{
for (int i = 0; i < col; i++)
result.push_back(matrix[--y][x]);
if (row == 0)
col = 1;
col--;
direct = RIGHT;
break;
}
}
}
return result;
}
};