54螺旋矩阵
题目描述
题目链接
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/68d6cf2dfb318386310cef71f8277ffa.png#pic_center)
模拟过程求解
#pragma once
#include <iostream>
#include<vector>
using namespace std;
class Solution
{
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
vector<int>ans;
if (matrix.empty())
{
return ans;
}
int row = matrix.size();
int col = matrix[0].size();
int length = row * col;
int up = 0;
int down = row - 1;
int left = 0;
int right = col - 1;
int elemNum = 0;
while (elemNum < length)
{
for (int j = left; j <= right; j++)
{
ans.push_back(matrix[up][j]);
elemNum++;
}
up++;
if (elemNum == length)
{
break;
}
for (int i = up; i <= down; i++)
{
ans.push_back(matrix[i][right]);
elemNum++;
}
right--;
if (elemNum == length)
{
break;
}
for (int j = right; j >= left; j--)
{
ans.push_back(matrix[down][j]);
elemNum++;
}
down--;
if (elemNum == length)
{
break;
}
for (int i = down; i >= up; i--)
{
ans.push_back(matrix[i][left]);
elemNum++;
}
left++;
if (elemNum == length)
{
break;
}
}
return ans;
}
};
int main()
{
vector<vector<int>> matrix;
vector<int>v1;
vector<int>v2;
vector<int>v3;
for (int i = 0; i < 3; i++)
{
v1.push_back(i + 1);
v2.push_back(i + 4);
v3.push_back(i + 7);
}
matrix.push_back(v1);
matrix.push_back(v2);
matrix.push_back(v3);
for (vector<vector<int>>::iterator it = matrix.begin(); it != matrix.end(); it++)
{
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
{
cout << *vit << " ";
}
cout << endl;
}
Solution S;
vector<int> res = S.spiralOrder(matrix);
for (vector<int>::iterator it = res.begin(); it != res.end(); it++)
{
cout << *it << " ";
}
cout << endl;
system("pause");
return 0;
}
运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b38bd785e95255344d84ff3bfdd31d4e.png#pic_center)
提交结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9987a9f93cb61ea6140e7ce4b6ba9f54.png#pic_center)
官方解答
官方解答
官方方法二:按层模拟
思路
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/657344c8db0c657251519e320224f18e.png#pic_center)
图示
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dbdb85a65fae34483fbca9b5e59593d7.png#pic_center)
class Solution1
{
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
if (matrix.size() == 0 || matrix[0].size() == 0)
{
return {};
}
int rows = matrix.size(), columns = matrix[0].size();
vector<int> order;
int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
while (left <= right && top <= bottom)
{
for (int column = left; column <= right; column++)
{
order.push_back(matrix[top][column]);
}
for (int row = top + 1; row <= bottom; row++)
{
order.push_back(matrix[row][right]);
}
if (left < right&& top < bottom)
{
for (int column = right - 1; column > left; column--)
{
order.push_back(matrix[bottom][column]);
}
for (int row = bottom; row > top; row--)
{
order.push_back(matrix[row][left]);
}
}
left++;
right--;
top++;
bottom--;
}
return order;
}
};