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;

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