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.

    思路:

    关键注意①每一圈中四条边的边界,要每一次都打印到这一条边的末尾。右边的策略是错的,因为在只有一行一列时每一条边都判定该元素是下一条边的,导致错误。

                         

    ②下面的边和左边的边还需要判断跟上面的边或右边的边是否重复。防止只有一行或者只有一列时出现重复。

    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> ans;
        if(matrix.empty()) return ans;
        int m = matrix.size();
        int n = matrix[0].size();
        int r, c;
        for(int k = 0; k <= (min(m, n) - 1) / 2; k++) //打印的圈数 最外圈为第0圈
        {
            //从左到右 最上面的那条边
            r = k;
            for(c = k; c <= n - 1 - k; c++)
                ans.push_back(matrix[r][c]);
            //从上到下 最右边的那条边
            c = n - 1 - k;
            for(r = k + 1; r <= m - 1 - k; r++)
                ans.push_back(matrix[r][c]);
            //从右到左 最下面的那条边
            r = m - 1 - k;
            for(c = n - 2 - k; c >= k && r > k; c--) //需要判断与上面的边不重合
                ans.push_back(matrix[r][c]);
            //从下到上 最左边的那条边
            c = k;
            for(r = m - 2 - k; r >= k + 1 && c < n - 1 - k; r--) //需要判断与右边的边不重合
    ans.push_back(matrix[r][c]); } return ans;
    }
  • 相关阅读:
    mybatis 查询一对多子表只能查出一条数据
    Docker 查看容器里Log4写的日 志文 件里的日志
    MYSQL之union的使用
    【前端开发】常见好用的流程图框架
    【推荐】好网站推荐
    【前端工具】好用的数据库工具Navicat
    jQuery ajax
    thinkphp6.0封装数据库及缓存模型
    Unity 3D使用C#脚本实例
    Unity 3D简单使用C#脚本,脚本的执行顺序
  • 原文地址:https://www.cnblogs.com/dplearning/p/4635075.html
Copyright © 2011-2022 走看看