Leetcode-54 螺旋矩阵

题目链接

曾经的代码

模拟螺旋,选了四个边界 但是循环套的很乱。

class Solution {
public:
    int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        int rows=matrix.size();        
        if(rows==0) return res;
        if(rows==1) return matrix[0];
        int cols=matrix[0].size();
        int x=0,y=-1,minx=0,miny=0;
        int num=rows*cols;
        while(res.size()!=num)
        {
            for(int i=0;i<4&&res.size()!=num;i++)
            {
                while(1)
                {
                    x+=move[i][0];
                    y+=move[i][1];
                    if(x>=rows||x<minx||y>=cols||y<miny)
                    {
                        x-=move[i][0];
                        y-=move[i][1];
                        break;
                    }
                    res.push_back(matrix[x][y]);
                }
                if(i==0) minx++;
            }
            rows--;
            cols--;
            miny++;
        }
        return res;
    }
};

学习了题解的改良版

x:上边界 rows:下边界
y:左边界 cols:右边界
参考题解
通过边界改动删去遍历过的那一行/列的数字。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if(matrix.size()==0) return res;
        int rows=matrix.size()-1;
        int cols=matrix[0].size()-1;
        int x=0;
        int y=0;
        while(true)//右下左上
        {
            for(int i=y;i<=cols;i++)
                res.push_back(matrix[x][i]);
            x++;
            if(x>rows) break;

            for(int i=x;i<=rows;i++)
                res.push_back(matrix[i][cols]);
            cols--;
            if(cols<y) break;

            for(int i=cols;i>=y;i--)
                res.push_back(matrix[rows][i]);
            rows--;
            if(x>rows) break;

            for(int i=rows;i>=x;i--)
                res.push_back(matrix[i][y]);
            y++;
            if(cols<y) break;
        }
        return res;

    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章