Spiral Matrix & Spiral Matrix II & Rotate Image

Spiral Matrix 又叫蛇形访问,通过每次循环访问一圈后,向里深入一层,关键是需要注意最后剩下一行或者一列的情况

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int >ans;
        if(matrix.size()==0)return ans;
        int b1=0,b2=0,e2=matrix.size()-1,e1=matrix[0].size()-1;
        while(b1<e1&&b2<e2){
        for(int i=b1;i<e1;i++)//l to r
            ans.push_back(matrix[b2][i]);
        for(int i=b2;i<e2;i++)//top to down
            ans.push_back(matrix[i][e1]);
        for(int i=e1;i>b1;i--)//r to l
            ans.push_back(matrix[e2][i]);
        for(int i=e2;i>b2;i--)//down to top
            ans.push_back(matrix[i][b1]);
        b1++;
        b2++;
        e1--;
        e2--;
        }
        if(b1==e1)while(b2<=e2)ans.push_back(matrix[b2++][b1]);
        else if(b2==e2)while(b1<=e1)ans.push_back(matrix[b2][b1++]);
        return ans;
        
    }
};

Spiral Matrix II 此题和上一题差别不大,因为是正方形,可能还简单一些,按照上面访问的方式读改为写即可

class Solution {
public:
    vector<vector<int> > generateMatrix(int n) {
        vector<vector<int> >ans;
        vector<int >a(n,0);
        for(int i=0;i<n;i++){
            ans.push_back(a);
        } 
        if(n==0)return ans;
        int b1=0,e1=n-1;
        int k=1;
        while(b1<e1){
             for(int i=b1;i<e1;i++){    
                   ans[b1][i]=k;
                   k++;
             }
             for(int i=b1;i<e1;i++){    
                  ans[i][e1]=k;
                  k++;
             }
             for(int i=e1;i>b1;i--){    
                  ans[e1][i]=k;
                  k++;
             }
             for(int i=e1;i>b1;i--){    
                 ans[i][b1]=k;
                 k++;
             }
             b1++;
             e1--;
        }
        if(b1==e1)ans[b1][b1]=k;
        return ans;
        
    }
};

Rotate Image 类似于Spiral Matrix ,通过先旋转外层,再旋转内层,逐层旋转

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int b=0,e=matrix.size()-1;
        if(e<=b)return;
        int tmp;
        while(b<e){
            for(int i=0;i<e-b;i++){
                   tmp=matrix[b][b+i];
                   matrix[b][b+i]=matrix[e-i][b];
                   matrix[e-i][b]=matrix[e][e-i];
                   matrix[e][e-i]=matrix[b+i][e];
                   matrix[b+i][e]=tmp;
            }
            b++;
            e--;
        }
        
    }
};

点赞