螺旋矩陣 兩道題

 


 因爲可能出現行和列的數值不一樣,所以採用上下左右的標識遍歷,且實時更新,判斷是否已遍歷完了

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>res;
        if(matrix.size()==0)return res;
        int left=0,right=matrix[0].size()-1;
        int up=0,down=matrix.size()-1;

        for(;left<=right&&up<=down;)
        {
            for(int j=left;j<=right;j++)res.push_back(matrix[up][j]);
            up++;
            //更新了up,需要判斷是否超出,超出推出循環
            if(up>down)break;
            for(int i=up;i<=down;i++)res.push_back(matrix[i][right]);
            right--;
            //更新了right,需要判斷是否超出,超出推出循環
            if(left>right)break;
            
            //如果上面豎,行,都存在,那邊下面代碼也肯定存在,
            for(int j=right;j>=left;j--)res.push_back(matrix[down][j]);
            down--;
            for(int i=down;i>=up;i--)res.push_back(matrix[i][left]);
            left++;
            
        }
        return res;
        
    }
};

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>res;
        if(matrix.size()==0)return res;
        int left=0,right=matrix[0].size()-1;
        int up=0,down=matrix.size()-1;

        for(;left<=right&&up<=down;)
        {
            //(left<=right&&up<=down) 每個條件判斷,效率不高
            for(int j=left;j<=right&&(left<=right&&up<=down);j++)res.push_back(matrix[up][j]);
            up++;

            for(int i=up;i<=down&&(left<=right&&up<=down);i++)res.push_back(matrix[i][right]);
            right--;

            for(int j=right;j>=left&&(left<=right&&up<=down);j--)res.push_back(matrix[down][j]);
            down--;

            for(int i=down;i>=up&&(left<=right&&up<=down);i--)res.push_back(matrix[i][left]);
            left++;

        }
        return res;
        
    }
};

 


 因爲是行和列都是一樣的,所以只用兩個標識遍歷,且不是實時更新,如果更新了後面無法遍歷了

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        //用一個行,和一個列標識就可以遍歷了
        int row=0,col=n-1;
        vector<vector<int>>res(n,vector<int>(n,-1));
        int m=1;
        for(;row<=col;row++,col--)
        {
            for(int c=row;c<=col;c++)res[row][c]=m++;
            
            for(int s=row+1;s<=col;s++)res[s][col]=m++;
            
            for(int c=col-1;c>=row;c--)res[col][c]=m++;
            //s>=row+1 別忘記了
            for(int s=col-1;s>=row+1;s--)res[s][row]=m++;
        }
        return res;
    }
};

 

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