顺时针打印二维数组C语言递归,按顺时针打印矩阵
存在二种解题思路: 一种是递归解法,一种是层层递进解法
图解递归解法
如图所示, 一个5*5的矩阵
先打印最外层的圈, 然后剩余最里层3*3的矩阵, 如图.
将3*3的矩阵继续打印最外层,思路与打印最外层思路一样,我们就可以考虑使用递归实现.
最后只剩余一个元素,也可以看成一个矩阵,不过不同大小的矩阵会出现不同形状的矩阵.共3种情况, 如下图.
如图所示, 共三种情况
一个方向的情况
三个方向的情况
四个方向的情况
代码实现思路
矩阵用代码表示为二维数据
首先遍历第一行所有的元素,即图中的从左到右箭头的数据.
然后遍历最右边的元素,即最后一列数据.即图中的从上到下箭头的数据.
再遍历最后一行元素,即图中从右到左箭头的数据
最后遍历最左列的元素,即图中从下到上箭头的数据.
将剩余的矩阵构建成一个子矩阵,即新的二维数组,然后递归传递.这是关键的一步
仅剩余1行1列即是递归退出条件
图解非递归解法
如图所示,我们可以将矩阵看作层层递进的矩阵,如俄罗斯的套娃一样.
第一个套娃的起点坐标,即(0,0)
第二个套娃的起点坐标,即(1,1)
第三个套娃的起点坐标,即(2,2)
代码实现思路
设置一个起点坐标start=0, 然后按方向遍历元素,与递归遍历一样.
我们发现55的矩阵, 最后一个圈坐标为(2,2), 44矩阵最后一个圈的坐标是(1,1),得出退出条件X坐标大于2倍起点坐标.Y坐标同理可得.
for x > 2start && y > 2start, 遍历完第1层圈,再遍历第2层圈, 即start++
代码片段
//解题3思路: 每一次从最左上角打印,即坐标为(0,0),打印最外层一圈. 然后打印第二圈,即坐标:(1,1), 以次类推
//时间复杂度:O(n)
func PrintMatrixLikeSnake(matrix [][]int) []int {
if len(matrix) <= 0 {
return nil
}
rows := len(matrix)
columns := len(matrix[0])
if columns <= 0 {
return nil
}
//定义一个结果集
result := make([]int, 0)
//准备打印第一个最外层的圈,定义一个启始坐标
start := 0
//我们发现5*5的矩阵, 最后一个圈坐标为(2,2), 4*4矩阵最后一个圈的坐标是(1,1),得出退出条件X坐标大于2倍起点坐标.Y坐标同理可得.
for rows > start * 2 && columns > start * 2 {
endX := columns-1-start
endY := rows-1-start
//从左到右打印,即第一行的边
for i := start; i <= endX; i++ {
result = append(result, matrix[start][i])
}
//从最右边从上到下打印,即最右边的边
if start < endY {
for i := start+1;i <= endY; i ++ {
result = append(result, matrix[i][endX])
}
}
//从最右边从右到左打印,即最下面的边
if start < endX && start < endY {
for i := endX-1; i >= start; i -- {
result = append(result, matrix[endY][i])
}
}
//从最左边从下到上打印,即最左边的边
if start < endY - 1 {
for i := endY-1; i >= start+1; i -- {
result = append(result, matrix[i][start])
}
}
start ++
}
return result
}
总结
不管使用递归还是非递归,我们首先要找出解题的思路, 仔细观察,多画图,多演算,假设.一步一步逼进最终解.
完整代码github: 完整代码
)
有疑问加站长微信联系(非本文作者)
相关文章:

降低噪声和电磁干扰的原则
1.尽量采用45折线转载于:https://www.cnblogs.com/asulove/p/3827246.html

翻译:java.util.regex.Pattern
java.util.regex.PatternA compiled representation of a regular expression. A regular expression(正则表达式), specified as a string, must first be compiled into an instance of this class(首先编译成Pattern对象). The…
学习笔记53—Wilcoxon检验和Mann-whitney检验的区别
Wilcoxon signed-rank test应用于两个related samples Mann–Whitney U test也叫Wilcoxon rank-sum test,应用于两个independent samples的情samples size小的时候,是有列表的,sample size大到20左右时,就可以使用正态分布来近似…

s-systemtap工具使用图谱(持续更新)
整体的学习思维导图如下,后续持续更新完善 文章目录安装简介执行流程执行方式stap脚本语法探针语法API函数探针举例变量使用基本应用1. 定位函数位置2. 查看文件能够添加探针的位置3. 打印函数参数(结构体)4. 打印函数局部变量5. 修改函数局…

2014 Super Training #8 C An Easy Game --DP
原题:ZOJ 3791 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode3791 题意:给定两个0-1序列s1, s2,操作t次,每次改变m个位置,求把s1改变为s2的方法总数。解法: DP,s1和s2哪些位置…

qq分享组件 android,移动端,分享插件
移动端,分享插件发布时间:2018-06-26 10:03,浏览次数:762最近有一个活动页需要在移动端浏览器分享网页到微信,QQ。虽然每一个浏览器都有分享到微信的能力,但不是每个都提供接口供网页来调用。及时有提供,浏…

MySQL中更改表操作
2019独角兽企业重金招聘Python工程师标准>>> 添加一列: alter table t_stu add tel char(20); 删除一个列: alter table t_stu drop column tel; 添加唯一约束: alter table t_stu add constraint uk_srname unique(scode); 添加主…

Maven-环境配置
二更 可算搞好了,除了下面外,我找到了setting.xml里面的东西,给出来就好了,简单就是mvn -v弄好后,setting.xml里面写好的话,直接加入,然后让eclipse下载jar包 然后就可以运行网上的基本项目了 1…

分布式存储(ceph)技能图谱(持续更新)
一下为个人结合其他人对分布式存储 所需的技能进行总结,绘制成如下图谱,方便针对性学习。 这里对分布式存储系统接触较多的是ceph,所以在分布式存储系统分支上偏向ceph的学习。 如有分类有问题或者分支不合理,欢迎大家批评指正,目…

android如何查看方法属于哪个类,Android Studio查看类中所有方法和属性
css-关于位置当你设置一个你想要相对的模块为relative 你这个模块为absolute 则你的这个absolute会相对relative的那个模块进行移动.微信公众平台自动回复wechatlib.jar的生成及wechatlib解析微信公众平台出来有一段时日了,官方提供的自动回复的接口调用大致是这么些…

读javascript高级程序设计03-函数表达式、闭包、私有变量
一、函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式。它们之间一个重要的区别是函数提升。 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); function test(){ alert(1); } 2.函数表达式不会进行函…

集成公司内部的多个子系统(兼容B/S和C/S),实现单点登录功能的多系统的统一入口功能...
有一句话也挺有意思的,一直在模仿但从未超越过,文章里的技术也都是相对简单的技术,但是实实在在能解决问题,提高效率。现在人都懒得瞎折腾,能多简单就多简单,谁都不希望总是做一些重复的工作,我…

mysql无法远程连接
在mysql的mysql数据库下: select user,host from user;(查看,没有本机的访问权限) grant all privileges on *.* to root"xxx.xxx.xxx.xxx" identified by "密码";(xx为本机ip,%为所有IP) flush privileges; select user,host from …

哈希表的分类,创建,查找 以及相关问题解决
总体的hash学习导图如下: 文章目录定义分类字符hash排序hash链式hash(解决hash冲突)创建链式hash查找指定数值STL map(hash)哈希分类 完整测试代码应用(常见题目)1. 回文字符串(Longest Palindrome&#x…

android 自定义音乐圆形进度条,Android自定义View实现音频播放圆形进度条
本篇文章介绍自定义View配合属性动画来实现如下的效果实现思路如下:根据播放按钮的图片大小计算出圆形进度条的大小根据音频的时间长度计算出圆形进度条绘制的弧度通过Handler刷新界面来更新圆形进度条的进度具体实现过程分析:首先来看看自定义View中定义…

jsp error-page没有生效
1、首页检查web.xml中的配置,确保路径是正确的 <error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> 2、然后再检查error.jsp文件内容是否有问题,比如只有<head>&…

CTO(首席技术官)
CTO(首席技术官)英文Chief Technology Officer,即企业内负责技术的最高负责人。这个名称在1980年代从美国开始时兴。起于做很多研究的大公司,如General Electric,AT&T,ALCOA,主要责任是将科…

把数组排成最小的数
题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 思路 一 需要找到字典序最小的哪个排列…

shell脚本自动执行,top命令无输出
shell脚本在系统启动时推后台自动执行,发现其中/usr/bin/top -n 1 -c -b -u ceph 命令并无输出 但是系统启动之后手动执行脚本,&推后台脚本中的top仍然能够正常输出,仅仅是系统发生重启,该功能就不生效了 stackoverflow 推荐…

0709 C语言常见误区----------函数指针问题
1.函数指针的定义 对于函数 void test(int a, int b){ // } 其函数指针类型是void (* ) (int , int), 注意这里第一个括号不能少, 定义一个函数指针,void (* pfunc)(int , int) ,其中pfunc就是函数指针类型, 它指向的函数类型必须…

android 定时换图片,android 视频和图片切换并进行自动轮播
刚入android没多久,遇到的比较郁闷的问题就是子线程主线程的问题,更改UI界面,本想做一个图片的轮播但是比较简单,然后就试试实现视频跟图片切换播放进行不停的循环播放。也用过不少控件,但是知其然不知其所以然&#x…

Win8:Snap 实现
Win8允许分屏的操作,所以我们必须让我们App能对Snap模式视图做出反应,这样也便于通过Store的审核。如果项目中在Snap展现的功能不大,我们可以仅用一张logo代替,类似系统的商店应用。 我的项目实现效果: 实现思路是在你…

ping命令使用及其常用参数
PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量检查网络是否连通,可以很好地帮助我们分析和判定网络故障。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消…

g-gdb工具使用图谱(持续更新)
如下为整个GDB的学习导图

android bitmap 转drawable,android Drawable转换成Bitmap失败
错误代码:08-07 06:42:30.482 28497-28497/app.tianxiayou E/AndroidRuntime﹕ FATAL EXCEPTION: mainProcess: app.tianxiayou, PID: 28497java.lang.RuntimeException: Unable to start activity ComponentInfo{app.tianxiayou/app.tianxiayou.AppInfoActivity}: …

微软职位内部推荐-Software Development Engineer II
微软近期Open的职位:Job Title:Software Development EngineerIIDivision: Server & Tools Business - Commerce Platform GroupWork Location: Shanghai, ChinaAre you looking for a high impact project that involves processing of billions of dollars, hundreds of …

Lync与Exchange 2013 UM集成:Exchange 配置
有点长时间没有更新文章了,也是由于工作的原因确实忙不过来,好在博客上还有这么多朋友支持,非常的欣慰啊。很久没有给大家带来新东西,真的非常抱歉,今天跟大家带来的是Lync Server 2013与Exchange Server 2013统一消息…
「Java基本功」一文读懂Java内部类的用法和原理
内部类初探 一、什么是内部类? 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限&#…

从一致性hash到ceph crush算法演进图谱(持续更新)
参考文档: https://ceph.com/wp-content/uploads/2016/08/weil-crush-sc06.pdf Ceph剖析:数据分布之CRUSH算法与一致性Hash

[原]unity3d之http多线程异步资源下载
郑重声明:转载请注明出处 U_探索 本文诞生于乐元素面试过程,被面试官问到AssetBundle多线程异步下载时,愣了半天,同样也被深深的鄙视一回(做了3年多u3d 这个都没用过),所以发誓要实现出来填补一…