题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
1、求出当前矩阵左上角的元素和右下角的元素。
2、根据这两个元素来确定我们需要遍历的具体位置。
3、当遍历完一圈的时候更新左上角元素和右下角元素。
细节:
当遍历最后一行的时候需要满足x1<x2因为若x1==x2最后一行就没有需要打印的数据了,因为仅剩的一个元素已经在最后一列打印过了。
当遍历第一列的时候需要满足y1<y2因为若y1==y2第一列就没有需要打印的数据了,因为仅剩的一个元素已经在最后一列打印过了。
代码
class Solution
{
// 画图去分析边界情况
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
// m行n列
int m=matrix.size();
int n=matrix[0].size();
vector<int> ret;
// 左上角的元素 (x1,y1)
// 右上角的元素 (x2,y2)
int x1=0,y1=0;
int x2=m-1,y2=n-1;
while(x1<=x2&&y1<=y2)
{
// 第一行
for(int i=y1;i<=y2;i++)
ret.push_back(matrix[x1][i]);
// 最后一列
for(int i=x1+1;i<=x2;i++)
ret.push_back(matrix[i][y2]);
// 最后一行
// 若x1==x2最后一行就没有需要打印的数据了,因为仅剩的一个元素已经在最后一列打印过了
if(x1<x2)
{
for(int i=y2-1;i>=y1;i--)
ret.push_back(matrix[x2][i]);
}
// 第一列
// 若y1==y2第一列就没有需要打印的数据了,因为仅剩的一个元素已经在第一行打印过了
if(y1<y2)
{
for(int i=x2-1;i>=x1+1;i--)
ret.push_back(matrix[i][y1]);
}
x1++;
y1++;
x2--;
y2--;
}
return ret;
}
};