zoukankan      html  css  js  c++  java
  • 【剑指offer】面试题20:顺时针打印矩阵

    题目描述

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:

    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.

    思路:

    这里没有使用书上的方法,而是维护一个二维坐标的最小最大值。假设横轴向左为x正方向,竖轴向下为y正方向,则依次从左到右、从上到下、从右到做、从下到上输出一个圈。能形成一个圈的条件是minx<maxx && miny<maxy。当此条件不满足时,分情况讨论打印出来即可。

    写代码时需要注意的地方:

    1.该坐标系下,x是列、y是行,所以取值时应该是matrix[y][x],而不是matrix[x][y];同理初始化maxx和maxy时,需要注意matrix[0].size()和matrix.size()

    2.入口处参数判断。不要忘了这一点,其次,对于vector,不是判断它是不是等于NULL。。。同理返回值也不是返回NULL,而是空容器。

    3.形成一个圈时,最后一个循环的判断条件,和前面三个稍微有些不同,注意下。

    总结:

    所以看到一个题之后,还是应该自己先想想,看自己想的话思路是怎样,然后再看答案。书上答案看得差不多懂了,还是感觉写起来有点麻烦,可能是因为不是自己的思路。自己的思路写出来也是对的,好像也挺简洁的。

    class Solution {
    public:
        vector<int> printMatrix(vector<vector<int> > matrix) {
            vector<int> res;
            //if(matrix==NULL || matrix.size()<=0 || matrix[0].size()<=0)  return NULL;
            if(matrix.size()<=0 || matrix[0].size()<=0)  return res;
            
            int minx=0,miny=0;
            int maxx=matrix[0].size()-1;
            int maxy=matrix.size()-1;
            
            while(minx<maxx && miny<maxy)
            {
                for(int x=minx;x<=maxx;++x)
                {
                    //res.push_back(x);
                    //res.push_back(miny);
                    //res.push_back(matrix[x][miny]);  晕死,所有的坐标都弄错了
                    res.push_back(matrix[miny][x]);
                }
                for(int y=miny+1;y<=maxy;++y)
                {
                    res.push_back(matrix[y][maxx]);
                }
                for(int x=maxx-1;x>=minx;--x)
                {
                    res.push_back(matrix[maxy][x]);
                }
                for(int y=maxy-1;y>=miny+1;--y)//条件是>=,不是<=  而且比较的数是miny+1,不是miny
                {
                    res.push_back(matrix[y][minx]);
                }
                
                minx++;
                maxx--;
                miny++;
                maxy--;
            }
            
            if(minx==maxx)
            {
                if(miny==maxy)
                {
                    res.push_back(matrix[miny][minx]);
                }
                else
                {
                    for(int y=miny;y<=maxy;++y)
                    {
                        res.push_back(matrix[y][minx]);
                    }
                }
            }
            else if(miny==maxy)
            {
                for(int x=minx;x<=maxx;++x)
                {
                    res.push_back(matrix[miny][x]);
                }
            }
            
            return res;
        }
    };
  • 相关阅读:
    如何使用数据卷在宿主机和docker容器之间共享文件
    Debian 7 安装 Docker
    ajax简单封装
    GridView列的排序功能
    SqlHelper帮助类
    模板引擎小例子
    WCF练习小程序总结
    热线接口开发调试工作记录
    在Oracle中使用rank()over()排名的问题
    项目实施中出现的问题点汇总
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4703343.html
Copyright © 2011-2022 走看看