首先顺时针打印矩阵,需要通过图解来理解:

上面是一个3 * 3 的矩阵,我们要将其按照顺时针打印,那么打印的结果就是 1 ➡ 2 ➡ 3 ➡ 4 ➡ 5 ➡ 6 ➡ 7 ➡ 8 ➡ 9

我们可以通过模拟的方法来进行顺时针打印矩阵:

1.求出矩阵的左右宽度、上下宽度、左右边线、上下边线

这里求二维矩阵的左右宽度是 矩阵.size()  上下宽度是 矩阵[0].size()

row为矩阵的宽,col为矩阵的高

那么这里的row其实记录的就是矩阵的列数,而col为矩阵的行数

这里左右边线的 c2 就可以定义为矩阵的列数

上下边线的 r2 就可以定义为矩阵的行数

2.需要计算出打印的次数

打印的次数可以通过得到行数和列数中的最小值来判断,通常判断完整的一圈是由两层构成的,因此在判断打印的次数的时候,可以通过除以 2 来判断。

上述判断可以分为两种,其中一种为行数和列数的最小值为偶数时,如上图 1 ,为 2 行 5 列的矩阵,那么打印次数为 2 / 2 = 1,因此打印的次数为 1 次,也就是打印一圈;而当为奇数时,如上图 2 ,为 3 行 4 列的矩阵, 3 / 2 = 1.5, 因此打印完一圈之后还得再加一圈才能全部打印完。

3.限制在计算出来的打印次数中模拟

从左往右打印,起点为 c1 ,终点为 c2 ,打印到 3 ,因为 r1 始终没变,将数据 1、2、3 放入容器中;

从上往下打印,起点为 r1 + 1,因为 3 已经打印过了,因此从 4 开始打印,重点为 r2,期间 c2 始终没变,将数据 4、5 放入容器中;

从右往左打印,起点为 c2 - 1,从 6 开始打印,终点为大于 c1,期间 r2 始终没变,将数据 6 放入容器中;

从下往上打印,起点为 r2 ,终点为大于 r1,从7开始打印,期间 c1 始终没变,将数据 7、8放入容器中;

4.以上为打印完一圈之后,将四条边线缩小

将四条边线缩小范围,这样可以继续遍历打印矩阵,r1 ++, r2 --, c1 ++, c2 --;

将范围缩小之后,可以设置一个范围,用以判断有没有打印完成,通过判断 c1 小于 c2,和r1小于 r2 来判断是否打印完成。

该题的难点是:1.设置四周边线 2.计算打印的次数 3.判断有没有打印完成

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;if(matrix.empty()) return res;// 定义左右宽度int row = matrix.size();// 定义上下宽度int col = matrix[0].size();// 定义左右边线int c1 = 0, c2 = matrix[0].size()-1;// 定义上下边线int r1 = 0, r2 = matrix.size()-1;// 定义打印的次数int times = min(row, col) % 2 == 0 ? min(row, col) / 2 : min(row, col) / 2 + 1;// 限制打印次数for(int i = 0;i < times;i++){// 开始打印// 从左到右打印for(int i = c1;i <= c2;i++) res.push_back(matrix[r1][i]);// 从上往下打印for(int i = r1+1;i <= r2;i++) res.push_back(matrix[i][c2]);// 判断有没有打印完if(r1 < r2 && c1 < c2){// 从右往左打印for(int i = c2 - 1;i > c1;i--) res.push_back(matrix[r2][i]);// 从下往上打印for(int i = r2;i > r1;i--) res.push_back(matrix[i][c1]);}r1++;r2--;c1++;c2--;}return res;}
};

29.顺时针打印矩阵相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java

    <LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...

  2. 剑指offer:面试题29. 顺时针打印矩阵

    题目:顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9 ...

  3. 剑指 Offer 29. 顺时针打印矩阵

    题目 剑指offer的解题思路 顺时针打印矩阵,可以分解为每次打印一个数,顺序是从左到右,从上到下,然后从右到左,从下到上. 打印每一圈的起点(startX,startY)分别为(0,0),(1,1) ...

  4. 【完整可运行代码】剑指 Offer 29. 顺时针打印矩阵

    立志用最少的代码做最高效的表达 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2, ...

  5. 剑指offer——29.顺时针打印矩阵(不熟)

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

  6. 打印矩阵 java_【Java】 剑指offer(29) 顺时针打印矩阵

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 思路 每次打印矩阵最外面的一圈(用方法printMatrix ...

  7. leetcode —— 面试题29. 顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] - ...

  8. 【leetcode】剑指 Offer 29. 顺时针打印矩阵(shun-shi-zhen-da-yin-ju-zhen-lcof)(模拟)[简单]

    链接 https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/ 耗时 解题:38 min 题解:10 min 题意 输入一 ...

  9. 剑指offer 29 顺时针打印矩阵(可逆时针,任一点开始)

    原书上写的解太麻烦了,而且还没有扩展性(比如从右上角开始打印,或者逆时针打印). 此外多个for循环的起止点也让人头晕,每个方向都要单独判断步进方向,因此代码也缺少优雅性. 这里我用direction ...

最新文章

  1. 回顾2017,展望2018
  2. arXiv灌水机:机器自动生成论文标题、摘要信息,还有40+奇妙AI应用
  3. uc3842开关电源电路图_UC3842构成的开关电源电路
  4. eclipse中不能找到dubbo.xsd解决方法
  5. 关系型数据库 (数据库类型)
  6. 协同过滤—基于图的方法
  7. 处理Akka应用程序中的每个事件
  8. python time模块
  9. LoadRunner11-遇到问题及解决办法
  10. 646. Maximum Length of Pair Chain 最长的链条长度
  11. 高斯过程回归python_scikit-learn中的多输出高斯过程回归
  12. Token九重天——如何设计区块链项目的通证模型
  13. QListView拖动排序
  14. WOai wojiao
  15. JavaScript一些优雅小技巧不得不知
  16. Mathorcup数学建模竞赛第六届-【妈妈杯】A题:基于模糊综合评价和灰色关联度的淡水养殖池塘水华分析、预测及净化模型(附一等奖获奖论文和matlab代码)
  17. Cadence 添加图片 LOGO
  18. oracle 远程连接配置
  19. friends第九季看完了,经典对白记录--gt;对婚姻有阴影的男人
  20. 敏捷的Scrum用户体验设计爱情故事

热门文章

  1. Linq(1.延迟的查询执行)
  2. 轴承故障诊断分类中常用的一些数据集介绍和获取方法
  3. 《C系列-实践相关》C语言十
  4. MATLAB中图像标注工具——Image Labeler的使用方法
  5. 计算机硬件故障的表现,电脑硬件坏了,各会出现什么样的症状?如何检修?
  6. 霸榜世界第一的在线教育App,靠什么增长到3亿用户?
  7. 转生活中的各种食品安全问题
  8. JavaWeb-学生宿舍管理系统
  9. Windows与Linux的MYSQL UDF提权分析
  10. js逆向-ast混淆还原入门案例(2)