1. 题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
2. 思路
直观的想法是按照题目所述,依次打印每个数字,细节必须处理好。如图所示
有四个方向,向右运行至边界或者已走过的数字时,转向下,同理向下运行至底部时或者已走过的数字时,转向左,以此类推。本题思路很简单,主要是如何处理代码细节,首先总共要打印矩阵大小mn个数字,因此循环mn次,每次添加一个元素,因此必须判断下一个元素是否到边界或者已走过的数字,而不是判断当前数字。
3. Coding
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
if (matrix.empty()) return vector<int>();
int m = matrix.size(), n = matrix[0].size();
vector<vector<bool>> visited(m, vector<bool>(n, false));
vector<vector<int>> dir = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
vector<int> ans;
int d = 0;
int i = 0, j = 0;
for(int k = 0; k < m * n; ++ k)
{
ans.push_back(matrix[i][j]);
visited[i][j] = true;
int ni = i + dir[d][0], nj = j + dir[d][1];
if (ni >= m || ni < 0 || nj >= n || nj < 0 || visited[ni][nj])
d = (d+1) % 4;
i += dir[d][0], j += dir[d][1];
}
return ans;
}