54. Spiral Matrix (Medium)
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
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]
.
Solution:
这道题让我们将一个矩阵按照螺旋顺序打印出来,我们只能一条边一条边的打印,首先我们要从给定的mxn的矩阵中算出按螺旋顺序有几个环,注意最终间的环可以是一个数字,也可以是一行或者一列。环数的计算公式是 min(m, n) / 2,知道了环数,我们可以对每个环的边按顺序打印,比如对于题目中给的那个例子,个边生成的顺序是(用颜色标记了数字) Red -> Green -> Blue -> Yellow -> Black
我们定义p,q为当前环的高度和宽度,当p或者q为1时,表示最后一个环只有一行或者一列,可以跳出循环。此题的难点在于下标的转换,如何正确的转换下标是解此题的关键,我们可以对照着上面的3x3的例子来完成下标的填写,代码如下:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if (matrix.empty() || matrix[0].empty()) return res;
int m = matrix.size(), n = matrix[0].size();
int c = m < n ? (m+1)/2 : (n+1)/2; // layer
int p = m, q = n; // row, col
for (int i = 0; i < c; ++i, p -= 2, q -= 2) { // loop by layer
for (int col = i; col < i+q; ++col)
res.push_back(matrix[i][col]);
for (int row = i+1; row < i+p; ++row)
res.push_back(matrix[row][i+q-1]);
if (p == 1 || q == 1) break;
for (int col = i+q-2; col >= i; --col)
res.push_back(matrix[i+p-1][col]);
for (int row = i+p-2; row > i; --row)
res.push_back(matrix[row][i]);
}
return res;
}