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

顺时针打印矩阵

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 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务