题目:螺旋形矩阵
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
根据螺旋矩阵的旋转轨迹,写出的;特别要注意边界处理,比如 [[1],[2],[3],[4]]这个用例,如果第二个循环处理过,第四个循环就不能在处理,而且必须要有其中一个循环处理。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int n = matrix.size();
if(n == 0) return res;
int m = matrix[0].size();
int circle = (n + 1) / 2;
int count = 0;
while(count < circle)
{
int i = count;
int j;
for( j = i; j < m - count; j++)
{
res.push_back(matrix[i][j]);
}
for(j = m - 1 - count, i = count + 1; j >= count && i < n - count; i++)
{
res.push_back(matrix[i][j]);
}
for(i = n - 1 - count, j = m - 2 - count; i >count && j >= count ; j--)
{
res.push_back(matrix[i][j]);
}
for(i = n - 2 - count ,j = count; i >count && j < m - 1- count; i--)
{
res.push_back(matrix[i][j]);
}
count++;
}
return res;
}
};
上面的代码看起来不是很直观,那么下面的就比较容易读
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.size() == 0)
return res;
int r1 = 0, r2 = matrix.size() - 1;
int c1 = 0, c2 = matrix[0].size() - 1;
while(r1 <= r2 && c1 <= c2)
{
for(int c = c1 ; c <= c2; c++)
{
res.push_back(matrix[r1][c]);
}
for(int r = r1 + 1; r <= r2; r++)
{
res.push_back(matrix[r][c2]);
}
if(r1 < r2 && c1 < c2)
{
for(int c = c2 - 1 ; c > c1; c--)
{
res.push_back(matrix[r2][c]);
}
for(int r = r2; r > r1; r--)
{
res.push_back(matrix[r][c1]);
}
}
r1++;
r2--;
c1++;
c2--;
}
return res;
}
};