剑指offer 刷了这么多题但是这一道,这个算法和其他人的算法都不一样 ,必须吹爆,

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.

解题思路

把题目给出的矩阵看成一个二维平面, 顺时针打印 就是顺时针走过二维平面,从轨迹上来看可以知道,当走到边界时,对走方向进行判断(优先级为上 ,右 ,下 ,左 ,即能上就不上 , 不上就右),上 ,右不通 , 左走过 , 只能下 ,就向下走

当下走到底时,同理,只能向左 ,

然后问题就出现在向做一步走的时候 , 走了一步后,由于优先级是先上,此时就会向上走,导致样例不通过。

所以使用last 变量 来记录 上一次的方向 , 且上一次方向优先级最高 。

代码实现

class Solution {
public:vector<int> printMatrix(vector<vector<int> > matrix) {//最直观的做法就是按照题目要求,遍历矩阵的边界,首先我们可以看出遍历到边界的时候,是向右遍历。//vector<int>res;int row = 0 , col = 0;const int mt_row = matrix.size();const int mt_col = matrix[0].size();int last = 10; //存储上次的方向 第一次就是右边int ** mt = (int **)malloc(sizeof(int*)*mt_row);  //记录路程for(int i = 0 ; i < mt_row ; i++){*(mt+i) = (int *)malloc(sizeof(int)*mt_col);memset(*(mt+i),0,sizeof(int)*mt_col);}res.push_back(matrix[row][col]);mt[row][col] = 1;while(direct(mt,row ,col,mt_row,mt_col,last)!=0){res.push_back(matrix[row][col]);}return res;}int direct(int ** mt,int & row ,int & col,const int mt_row , int mt_col ,int & last) // 0 表示结束 (0,1) 1 表示下 ,(0,-1)-1 表示上 ,(1,0) 10 表示右边 , (-1,0)-10 表示左边{   switch (last){case 1:if(row +1 < mt_row && mt[row+1][col]!=1) //向下延展{mt[++row][col] = 1;return 1;}break;case -1:if(row-1>=0 && mt[row-1][col] != 1) //向上延展{mt[--row][col] = 1;return -1;}break;case 10:if(col + 1< mt_col && mt[row][col+1]!=1) //向右延展{mt[row][++col] = 1;return 10;}break;case -10:if(col -1 >= 0 && mt[row][col-1] != 1) //向左延展{mt[row][--col] = 1;return -10;}break;}//顺序即为优先级if(row-1>=0 && mt[row-1][col] != 1) //向上延展{mt[--row][col] = 1;last = -1;return -1;}if(col + 1< mt_col && mt[row][col+1]!=1) //向右延展{mt[row][++col] = 1;last = 10;return 10;}if(row +1 < mt_row && mt[row+1][col]!=1) //向下延展{mt[++row][col] = 1;last = 1;return 1;}if(col -1 >= 0 && mt[row][col-1] != 1) //向左延展{mt[row][--col] = 1;last = -10;return -10;}return 0;}
};

引申

这个代码不仅能实现顺时针, 同样还可以逆时针,甚至X型 S型 都可以实现,前两者只需要对direct 函数进行优先级的调整 ,后者需要增加新的方向。

剑指offer- 顺时针打印矩阵 精品算法相关推荐

  1. [剑指offer]顺时针打印矩阵

    [剑指offer]顺时针打印矩阵 剑指offer-顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4, ...

  2. 剑指offer:顺时针打印矩阵(java)

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

  3. 剑指offer 顺时针打印矩阵

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

  4. 剑指offer--20.顺时针打印矩阵

    题目:输入一个矩阵,按照从外向里以顺时针顺序依次打印出每一个数字 分析:可以把矩阵想象为若干个圈,用一个循环来打印矩阵,每次打印矩阵中的一个圈,如左图.设矩阵行rows,列是columns,打印第一圈 ...

  5. 剑指offer29顺时针打印矩阵

    class Solution {public int[] spiralOrder(int[][] matrix) {if(matrix.length == 0) return new int[0];/ ...

  6. 剑指Offer——顺时针遍历矩阵

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

  7. 【剑指 Offe】剑指 Offer 17. 打印从1到最大的n位数

    目录标题 算法汇总 题目 关键点 代码 1.解体方法 思路 代码 时间和空间复杂度 2.解题方法,如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总,包括GitHub源码地址链接:力 ...

  8. 【LeetCode】剑指 Offer 17. 打印从1到最大的n位数

    [LeetCode]剑指 Offer 17. 打印从1到最大的n位数 文章目录 [LeetCode]剑指 Offer 17. 打印从1到最大的n位数 一.大数 一.大数 将 1~9 加入队列 对队列中 ...

  9. 【牛客 - 剑指offer】JZ12 矩阵中的路径 深度优先搜索DFS Java实现

    文章目录 剑指offer题解汇总 Java实现 本题链接 题目 题目主要信息 方案 深度优先搜索 剑指offer题解汇总 Java实现 https://blog.csdn.net/guliguligu ...

最新文章

  1. Kali渗透测试——UPNP网关发现工具Miranda
  2. 度量、符号、转换关系
  3. Java反编译的代码可以修改么
  4. oracle查看被锁的表和解锁
  5. windows中search driver的顺序
  6. java声明arraylist,在java构造函数中声明ArrayList
  7. asp.net中的post和get请求操作
  8. 网络智能和大数据公开课Homework3 Map-Reduce编程
  9. bzoj2423[HAOI2010]最长公共子序列
  10. Opencv之生成棋盘标定板
  11. 使用Java FXGL构建太空游侠游戏
  12. android的自定义字体,Android中使用自定义字体的方法
  13. NOI-Linux使用技巧
  14. 2年修完6个清华CS硕士学位第3周反思报告
  15. 凯文·凯利:最伟大的产品还没有被创造出来
  16. NAT 穿透是如何工作的
  17. 机器学习平台基础知识
  18. Phobos Runtime Library
  19. 软件测试以bug数来考核,软件测试能力提升及其思考
  20. 互联网基础结构发展的三个阶段

热门文章

  1. JS学习笔记-判断文本域当中滚动条的位置、滚动条下拉至底部才可以提交
  2. iOS UIColor,CGColor,CIColor三者的区别和联系
  3. GTX860M安装Tensorflow gpu踩坑
  4. MapReduce NativeTask优化详解
  5. 民生银行支票套打excel
  6. JNI调用本地库时JAVA虚拟机异常退出问题定位,通过虚拟机生成的hs_err_pidxxx.log日志文件定位过程...
  7. Ubuntu分区方案——如何科学的规划
  8. 数据库操作重点总结记录 ExecuteReader OleDbDataReader...
  9. 线去皮也有专门的工具
  10. bitoken是什么币_区块链入门 | Coin还是Token?背后的逻辑是什么?