题解 | #顺时针打印矩阵#

顺时针打印矩阵

http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a

第六十一题 模拟第一题 方法2也不方便
方法1
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        // 两个方法,一种就是正常的遍历,每次修改上下左右的边界
        // 还有一种就是:每次访问最外面一圈 然后递归调用
        vector<int> retans;
        
        int shang=0;
        int xia=matrix.size()-1;
        int zuo =0;
        int you =matrix[0].size()-1;
        
        while(true){
            // 左到右
            for (int i=zuo;i<=you;i++)
                retans.push_back(matrix[shang][i]);
            shang++;
            if(shang>xia)
                break;
            // 上到下
            for(int i=shang;i<=xia;i++)
                retans.push_back(matrix[i][you]);
            you--;
            if(zuo>you)
                break;
            
            // 右到左
            for(int i=you;i>zuo-1;i--)
                retans.push_back(matrix[xia][i]);
            xia--;
            if(shang>xia)
                break;
            // 下到上
            for(int i=xia;i>shang-1;i--)
                retans.push_back(matrix[i][zuo]);
            zuo++;
            if(zuo>you)
                break;
        }
        return retans;
    }
};


方法2 标准答案 没必要递归啊。。。
class Solution {
public:
    void print(int lx, int ly, int rx, int ry, vector<vector<int>> &matrix, vector<int> &ret) {
        // 左到右边界
        for (int j=ly; j<=ry; ++j)
            ret.push_back(matrix[lx][j]);
        // 上到下边界
        for (int i=lx+1; i<=rx; ++i)
            ret.push_back(matrix[i][ry]);
        // 右到左边界
        int h = rx - lx + 1;
        if (h > 1)
            for (int rj=ry-1; rj>=ly; --rj)
                ret.push_back(matrix[rx][rj]);
        // 下到上边界
        int w = ry - ly + 1;
        if (w > 1)
            for (int ri = rx-1; ri>=lx+1; --ri)
                ret.push_back(matrix[ri][ly]);
    }
    vector<int> printMatrix(vector<vector<int>>& matrix) {
        // 方法二 一圈一圈的打印 直接抄答案了
        vector<int> ret;
        if (matrix.empty())
            return ret;
        
        // 每一圈的左右边界 通过传递上下左右的边界决定输出的结果
        int lx = 0, ly = 0;
        int rx = matrix.size()-1, ry = matrix[0].size()-1;
        while (lx <= rx && ly <= ry) {
            print(lx++, ly++, rx--, ry--, matrix, ret);
        } 
        return ret;
    }

};

题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务