给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
vector<int> result;
int rowSize = matrix.size();//行数
if (rowSize == 0){
return result;
}
int colSize = matrix[0].size();//列数
int row = 0, col = -1;//初始扫描坐标
for (int i = 0; i <= rowSize / 2; ++i){//圈层
while (col + 1 < colSize && matrix[row][col + 1] != INT_MIN){//圈的上方行(从左到右)
++col;
result.push_back(matrix[row][col]);
matrix[row][col] = INT_MIN;
}
while (row + 1 < rowSize && matrix[row + 1][col] != INT_MIN){//圈的右边列(从上到下)
++row;
result.push_back(matrix[row][col]);
matrix[row][col] = INT_MIN;
}
while (col - 1 >= 0 && matrix[row][col - 1] != INT_MIN){//圈的下边行(从右到左)
--col;
result.push_back(matrix[row][col]);
matrix[row][col] = INT_MIN;
}
while (row - 1 >= 0 && matrix[row - 1][col] != INT_MIN){//圈的左边列(从下到上)
--row;
result.push_back(matrix[row][col]);
matrix[row][col] = INT_MIN;
}
}
return result;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> spiralArray;
// 原矩阵的高度
int row = matrix.size();
if (row == 0)
return spiralArray;
// 原矩阵的长度
int column = matrix[0].size();
if (column == 0)
return spiralArray;
// m,n记录当前所能到达的最大长和宽
int m = column;
int n = row;
// a,b记录当前位置的坐标
int a = 0, b = -1;
// 记录步数
int i = 0;
// flag记录方向,1代表向右,2代表向下,3代表向左,4代表向上
int flag = 1;
// num代表已统计数字
int num = 0;
while (num != column * row)
{
i = 0;
// 向右移动
if (flag == 1)
{
while (i < m)
{
b++;
//cout << a << '-' << b << endl;
spiralArray.push_back(matrix[a][b]);
num++;
i++;
}
n--;
//cout << m << '+' << n << endl;
flag = 2;
}
// 向下移动
else if (flag == 2)
{
while (i < n)
{
a++;
//cout << a << '-' << b << endl;
spiralArray.push_back(matrix[a][b]);
num++;
i++;
}
m--;
//cout << m << '+' << n << endl;
flag = 3;
}
// 向左移动
else if (flag == 3)
{
while (i < m)
{
b--;
//cout << a << '-' << b << endl;
spiralArray.push_back(matrix[a][b]);
num++;
i++;
}
n--;
//cout << m << '+' << n << endl;
flag = 4;
}
// 向上移动
else if (flag == 4)
{
while (i < n)
{
a--;
//cout << a << '-' << b << endl;
spiralArray.push_back(matrix[a][b]);
num++;
i++;
}
m--;
//cout << m << '+' << n << endl;
flag = 1;
}
else
{
break;
}
}
return spiralArray;
}
};