顺时针打印矩阵

/*
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
*/

class Solution {

public:
    // 解决思路:画图  大的问题分为小问题  以每一圈为例
    vector<int> printMatrix(vector<vector<int> > matrix) {
        std::vector<int> vecRet ;
        int nRow = matrix.size() ;
        if(nRow == 0) return vecRet ;
        int nCol = matrix[0].size() ;
        if(nCol == 0) return vecRet ;
        
        vecRet.reserve(nRow * nCol) ; // 适当reserve一下 展示给面试官 你写代码的效率控性格
        int nStart = 0 ;
        while(nRow > 2 * nStart && nCol > 2 * nStart) {
            printMatrixInOneCircle(vecRet, matrix, nRow, nCol, nStart) ;
            ++nStart ;
        }
        
        return vecRet ;
    }
    
    void printMatrixInOneCircle(std::vector<int>& vecRet, std::vector<std::vector<int> >& matrix, int nRow, int nCol, int nStart) {
        int nRowEnd = nRow - 1 - nStart ;
        int nColEnd = nCol - 1 - nStart ;
        
        // from left to right
        for(int i = nStart; i <= nColEnd; ++i) {
            vecRet.push_back(matrix[nStart][i]) ;
        }
        
        // from top to down  2*1 at least
        if(nStart < nRowEnd) {
            for(int i = nStart + 1; i <= nRowEnd; ++i) {
                vecRet.push_back(matrix[i][nColEnd]) ;
            }
        }
        
        // from right to left  2*2 at least
        if(nStart < nColEnd && nStart < nRowEnd) {
            for(int i = nColEnd - 1; i >= nStart; --i) {
                vecRet.push_back(matrix[nRowEnd][i]) ;
            }
        }
        
        // from down to top  3*2 at lease
        if(nStart < nRowEnd - 1 && nStart < nColEnd) {
            for(int i = nRowEnd - 1; i >= nStart + 1; --i) {
                vecRet.push_back(matrix[i][nStart]) ;
            }
        }
    }
};









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值