这一题思考了很久,本来是按照绕圈走的方式,定义了一个二维数组指示方向dp[4][2],走一圈下来有的测试样例对,有的测试样例就不对了,尤其是对于matrix.size()为1 和 matrix[0].size()为1 的测试,错误代码为了提醒自己记录如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
if(matrix.size()==0)
return {};
int m=matrix.size();
int n=matrix[0].size();
int shang=0,xia=m-1,zuo=0,you=n-1;
int index=0;
int ans_idx=0;
vector<int> ans(m*n);
int dp[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//右 下 左 上
int flag=0;
for(int i=0,j=0;i<m && j<n;)
{
ans[ans_idx]=matrix[i][j];
ans_idx++;
if(shang==xia && zuo==you)
break;
//怎么拐弯
if(i==shang && j==you)//右上
{
index=1;
if(i!=0 && j!=n-1)
zuo++;
}
else if(i==xia && j==you)//右下
{
index=2;
shang++;
}
else if(i==xia && j==zuo)//左下
{
index=3;
you--;
}
else if(i==shang && j==zuo)//左上
{
index=0;
if(flag) xia--;
flag=1;
}
i+=dp[index][0];
j+=dp[index][1];
}
return ans;
}
};
思考了一下午就是不知道上下左右啥时候++ --,绕了个云里雾里,今天才开始参照了题解的思路,走一圈下来,top bottom left right 操作一通,还有一些限制的位置,比如left!=right top!=bottom应该放在哪里,这类问题可能难度上很多人说简单,但是我遇到了并且卡住了,我觉得还是需要认真思考清楚的,时长在脑子里想一想,记录一下只为了提醒自己!