54. 螺旋矩阵 - 力扣(LeetCode)
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
思路解析:
这道题思路很简单,就是设置一个点顺时针进行遍历,每次遍历完一条竖列或者一条横行的时候,都需要进行给自己的路径上设一堵墙,保证他后续不会再碰到遍历过的元素,当两堵墙上相邻时, 此时就遍历结束了,这时候判断的依据就是(你能走的最高的行小于你能走的最低的行,或者是你能走的最右边的列小于能走的最左边的列)
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> v;
if(matrix.empty())
{
return v;
}
int left = 0, right = matrix[0].size() - 1, up = 0, low = matrix.size() - 1;
while(true)
{
//二维数组第一个元素是横行,第二个是数列
//朝左,起始点是[up, left],up不变
for(int i = left; i <=right; i++)
{
v.push_back(matrix[up][i]);
}
//坐过一横行需要++设置墙,需要注意,一旦大于下墙标志着遍历结束
if(++up > low)
{
break;
}
//朝下,起始点是[up, right],right不变
for(int i = up; i <= low; i++)
{
v.push_back(matrix[i][right]);
}
//坐过一竖列需要--设置墙,需要注意,一旦小于左墙标志着遍历结束
if(--right < left)
{
break;
}
//朝右,起始点是[low, right],low不变
for(int i = right; i >=left; i--)
{
v.push_back(matrix[low][i]);
}
//坐过一横行需要--设置墙,需要注意,一旦小于上墙标志着遍历结束
if(--low < up)
{
break;
}
//朝上,起始点是[low, left],left不变
for(int i = low; i >= up; i--)
{
v.push_back(matrix[i][left]);
}
//坐过一竖行需要++设置墙,需要注意,一旦大于右墙标志着遍历结束
if(++left > right)
{
break;
}
}
return v;
}
};