剑指offer- 顺时针打印矩阵 精品算法
剑指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- 顺时针打印矩阵 精品算法相关推荐
- [剑指offer]顺时针打印矩阵
[剑指offer]顺时针打印矩阵 剑指offer-顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4, ...
- 剑指offer:顺时针打印矩阵(java)
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 则依次打印出数字1,2,3, ...
- 剑指offer 顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 则依次打印出数字1,2,3 ...
- 剑指offer--20.顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针顺序依次打印出每一个数字 分析:可以把矩阵想象为若干个圈,用一个循环来打印矩阵,每次打印矩阵中的一个圈,如左图.设矩阵行rows,列是columns,打印第一圈 ...
- 剑指offer29顺时针打印矩阵
class Solution {public int[] spiralOrder(int[][] matrix) {if(matrix.length == 0) return new int[0];/ ...
- 剑指Offer——顺时针遍历矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- 【剑指 Offe】剑指 Offer 17. 打印从1到最大的n位数
目录标题 算法汇总 题目 关键点 代码 1.解体方法 思路 代码 时间和空间复杂度 2.解题方法,如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总,包括GitHub源码地址链接:力 ...
- 【LeetCode】剑指 Offer 17. 打印从1到最大的n位数
[LeetCode]剑指 Offer 17. 打印从1到最大的n位数 文章目录 [LeetCode]剑指 Offer 17. 打印从1到最大的n位数 一.大数 一.大数 将 1~9 加入队列 对队列中 ...
- 【牛客 - 剑指offer】JZ12 矩阵中的路径 深度优先搜索DFS Java实现
文章目录 剑指offer题解汇总 Java实现 本题链接 题目 题目主要信息 方案 深度优先搜索 剑指offer题解汇总 Java实现 https://blog.csdn.net/guliguligu ...
最新文章
- Kali渗透测试——UPNP网关发现工具Miranda
- 度量、符号、转换关系
- Java反编译的代码可以修改么
- oracle查看被锁的表和解锁
- windows中search driver的顺序
- java声明arraylist,在java构造函数中声明ArrayList
- asp.net中的post和get请求操作
- 网络智能和大数据公开课Homework3 Map-Reduce编程
- bzoj2423[HAOI2010]最长公共子序列
- Opencv之生成棋盘标定板
- 使用Java FXGL构建太空游侠游戏
- android的自定义字体,Android中使用自定义字体的方法
- NOI-Linux使用技巧
- 2年修完6个清华CS硕士学位第3周反思报告
- 凯文·凯利:最伟大的产品还没有被创造出来
- NAT 穿透是如何工作的
- 机器学习平台基础知识
- Phobos Runtime Library
- 软件测试以bug数来考核,软件测试能力提升及其思考
- 互联网基础结构发展的三个阶段
热门文章
- JS学习笔记-判断文本域当中滚动条的位置、滚动条下拉至底部才可以提交
- iOS UIColor,CGColor,CIColor三者的区别和联系
- GTX860M安装Tensorflow gpu踩坑
- MapReduce NativeTask优化详解
- 民生银行支票套打excel
- JNI调用本地库时JAVA虚拟机异常退出问题定位,通过虚拟机生成的hs_err_pidxxx.log日志文件定位过程...
- Ubuntu分区方案——如何科学的规划
- 数据库操作重点总结记录 ExecuteReader OleDbDataReader...
- 线去皮也有专门的工具
- bitoken是什么币_区块链入门 | Coin还是Token?背后的逻辑是什么?