Leetcode中疯狂的matrix

题目一:Spiral Matrix

Given a matrix of m*n elements (m rows, n columns), return all elements of the matrix in spiral order. 

思路:本题目要求螺旋的方式从最外层读到最里层。注意这里是一般矩阵,不是方针,所有要小心最里层重复读的情况。即避免从右到左和从左到右读一样的,从下到上和从上到下读一样的。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> res;
        int m=matrix.size();
        if(m==0) return res;
        
        int n=matrix[0].size();
        //特殊情况处理
        if(m==1 || n==1){
            for(int i=0; i<m; i++)
                for(int j=0; j<n; j++)
                    res.push_back(matrix[i][j]);
            return res;
        }
        //一般情况
        int loops=min(m,n);
        if(loops%2==1) loops=loops/2+1;  //对层次的处理!
        else loops=loops/2;
        
        int i;
        for(int lev=0; lev<loops; lev++){   
            for(i=lev; i<n; i++)  //从左到右读到头
                res.push_back(matrix[lev][i]);
            for(i=lev+1; i<m; i++)  //从上到下读到头
                res.push_back(matrix[i][n-1]);
            if(lev<m-1)
                for(i=n-2; i>=lev; i--)  //从右到左读到头
                    res.push_back(matrix[m-1][i]);
            if(lev<n-1)
                for(i=m-2; i>lev; i--)  //从下到上
                    res.push_back(matrix[i][lev]);
            m--;
            n--;
        }
        return res;
    }
};

题目二: Spiral Matrix II

Given an integer n, generate a square matrix filled with elements from 1 to n^2 in spiral order. 

思路:这里是方针,n即为层数。

class Solution {
public:
    vector<vector<int> > generateMatrix(int n) {
        vector<vector<int> > res;
        if(n==0) return res;
        res.resize(n);
        for(int i=0; i<n; i++)
            res[i].resize(n);
        //特殊情况出去(不到一圈)
        if(n==1){
            res[0][0]=1;
            return res;
        }
        //一圈或者大于一圈
        int cnt=1;
        int loop=n/2;
        if(n&1) loop=loop+1;
        
        for(int lev=0; lev<loop; lev++){
            for(int i=lev; i<n; i++)  //从左到右到头
                res[lev][i]=cnt++;
            for(int i=lev+1; i<n; i++)  //从上到下到头
                res[i][n-1]=cnt++;
            for(int i=n-2; i>=lev; i--)  //从右到左到头
                res[n-1][i]=cnt++;
            for(int i=n-2; i>lev; i--)  //从下到上
                res[i][lev]=cnt++;
            n--;
        }
        
    }  
};

题目三: Rotate Image

You are given an n*n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place?

思路:分析规律。因为是in-place算法而且又要改变matrix的样子,故需要事先保存一些必要的量。

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int n=matrix.size();
        
        for(int lev=0; lev<n/2; lev++){  //这里为方针,故level数为n/2
            int first=lev;
            int last=n-1-lev;
            for(int i=lev; i<last; i++){  
                int top=matrix[lev][i];  //保存最开始的位置
                int offset=i-lev;
                matrix[lev][i]=matrix[last-offset][lev]; //从左到上
                matrix[last-offset][lev]=matrix[last][last-offset]; //从下到左
                matrix[last][last-offset]=matrix[i][last]; //从右到下
                matrix[i][last]=top;
            }
        }
        
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值