周末稍作修整,按心情挑几道题目做做,看到了岗位面试题集,就点进来了~
这道题,leetcode上刷过类似的,是 n 平方的 螺旋矩阵,从这道题目来看,我还是没能掌握该题型!!
思路:
回顾:
leetcode 59 螺旋矩阵 给定 n * n 的矩阵,输出 顺时针的数组元素。解题的关键是 选择什么变量 作为循环的条件!!!答案:圈数,根据行列计算得到。由于是 方阵,因此,当出现 n%2 不为0时,不成圈,需要另外补值。
本题:
最大的难点在于该矩阵为非方阵,因此圈数的计算以及多种补值的情况。
下图是对代码的注解,方便理解代码:
代码:
bool flag=true;
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int row=matrix.size();int col=matrix[0].size();
vector<int>result;
if(row==1&&col==1)return {matrix[row-1][col-1]};
if(row==1||col==1)
{
int b=0;
if(row==1)
{
while(b<col)
result.push_back(matrix[row-1][b++]);
}
if(col==1)
{
while(b<row)
result.push_back(matrix[b++][col-1]);
}
return result;
}
int i;
int j;
int q_turn=min(row,col)/2;//定义圈数
int offset=1;//定义偏置
int x=0;int y=0;//定义起始坐标
while(q_turn--)
{
i=x;j=y;
for(j=y;j<y+col-offset;j++)
result.push_back(matrix[i][j]);
for(i=x;i<x+row-offset;i++)
result.push_back(matrix[i][j]);
for(;j>y;j--)
result.push_back(matrix[i][j]);
for(;i>x;i--)
result.push_back(matrix[i][j]);
//一圈走完了。下一个起始结点
x++;y++;
offset=offset+2;//偏置
}
if(min(row,col)%2)
{
if(x==row-min(row,col)/2-1){
while(y<col-min(row,col)/2)
result.push_back(matrix[x][y++]);
}
else if(y==col-min(row,col)/2-1){
while(x<row-min(row,col)/2)
result.push_back(matrix[x++][y]);
}
}
return result;
}
};
很绕,需要好好消化!!!