ltx_zero

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

leetcode no.54 螺旋矩阵(数组)

顺时针访问数组,到边界(超出矩阵大小或遇到已访问折回去),转方向需要注意操作。

  • 转方向条件:横竖越界或者碰到vis=1 退出条件:访问完m*n个元素
  • 每次刚进来让temp=start,里层循环一条线一个方向,每次试探之前让start=temp(即上一轮移动结果),当前start点设置为已访问,然后产生新的temp,最后temp违规,更新方向,之后修改start(此处如果不修改,哪那么下一次进来还是vis=1的start)。进入下一轮大循环。
  • 有大于0的判断,且必须在判断vis数组为0之前,不然访问负下标直接报错
  • 记得更新color的值

注意为空的时候没有横向长度,metric[0].size是不合法的。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>ans;
        int len1=matrix.size();
        if(len1==0) return ans;
        int len2=matrix[0].size();
        int x[4]={0,1,0,-1};
        int y[4]={1,0,-1,0};
        int startx=0;
        int starty=0;
        int tempx=startx;
        int tempy=starty;
        int color=0;
        int vis[100][100]={0};
        int i=0;
        while(color<len1*len2)
        {
            tempx=startx;
            tempy=starty;
            //printf("(%d,%d)",startx,starty);
            while(tempx<len1 && tempy<len2 && tempx>=0 && tempy>=0 && vis[tempx][tempy]==0 )
            {
                startx=tempx;
                starty=tempy;
                vis[tempx][tempy]=1;
                //printf("%d",matrix[startx][starty]);
                color++;
                ans.push_back(matrix[startx][starty]);
                tempx+=x[i];
                tempy+=y[i];
            }
            i++;
            i=i%4;
            startx+=x[i];
            starty+=y[i];
        }
        return ans;
    }
};
View Code

 

posted on 2020-07-19 23:50  ltx_zero  阅读(94)  评论(0编辑  收藏  举报