这一题思考了很久,本来是按照绕圈走的方式,定义了一个二维数组指示方向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应该放在哪里,这类问题可能难度上很多人说简单,但是我遇到了并且卡住了,我觉得还是需要认真思考清楚的,时长在脑子里想一想,记录一下只为了提醒自己!