题目简单易懂:给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
说实话,刚做这题看着思路简单,但实际上自己上手还是有点困难,首先我们把框架写好
class Solution {
public:
std::vector<int> spiralOrder(std::vector<sdt::vector<int>>& matrix)
{
std::vector<int> ret;
}
};
思路是非常清晰的,我们需要搭建四个边界来约束螺旋输出,同时还要有更新边界的设定,所以可以填充以下:
class Solution {
public:
std::vector<int> spiralOrder(std::vector<sdt::vector<int>>& matrix)
{
std::vector<int> ret;
int up=0;
int down=?;
int left=?;
int right=?
while(?)
{ //第一步从左往右移动
for (int i = left; i < right; i++)
ret.push_back(matrix[up][i]);
up++;
//set new upside boundary
//第二步从上往下
for (int i = up; i < down; i++)
ret.push_back(matrix[i][right]);
right--;
//set new rightside boundary
//第三步从右往左
for (int i = right; i > left; i--)
ret.push_back(matrix[down][i]);
down--;
//set new downside boundary
//第四步从下往上
for (int i = down; i > up; i--)
ret.push_back(matrix[i][left]);
//set new leftside boundary
left++;
}
}
};
问号中的就是我们暂时不知道要填什么的东西 ,以及我们还缺少的重新设定边界的部分。
然后根据逻辑我们就可以推出来
int up = 0;
int down = matrix.size()-1;
int left =0;
int right =matrix[0].size()-1 ;
我们已经设计好了新边界的执行代码,那么又该如何设置跳出循环的,也就是已经完成输出的呢,这里的一个思路是,如果边界交叉,那么我们可以认定已经完成输出。
所以最后代码:
class Solution {
public:
std::vector<int> spiralOrder(std::vector<std::vector<int>>& matrix)
{
std::vector<int> ret;
int up = 0;
int down = matrix.size()-1;
int left =0;
int right =matrix[0].size()-1 ;
while (1)
{
for (int i = left; i <= right; i++)
ret.push_back(matrix[up][i]);
up++;
//set new upside boundary
if (up > down)
break;
for (int i = up; i <= down; i++)
ret.push_back(matrix[i][right]);
right--;
if (right < left)
break;
//set new rightside boundary
for (int i = right; i >= left; i--)
ret.push_back(matrix[down][i]);
down--;
if (down < up)
break;
//set new downside boundary
for (int i = down; i >= up; i--)
ret.push_back(matrix[i][left]);
//set new leftside boundary
left++;
if (left > right)
break;
}
}
};