您的位置:首页 > 其它

Spiral Matrix & Spiral Matrix II & Rotate Image

2014-05-10 19:31 323 查看
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--;
}

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 算法