小灰 程序员小灰

 在周一发布的漫画当中,小灰忽略了一个小问题:


当二维数组的最内层只有一行或一列时,螺旋遍历有可能重复访问。因此必须在第3和第4个小循环中加上额外的条件限制。


今天出了一个修订版,修正了这个缺陷。


非常感谢大家的指正。

​漫画:如何螺旋遍历二维数组?(修订版)_Java

​漫画:如何螺旋遍历二维数组?(修订版)_Java_02



—————  第二天  —————

​漫画:如何螺旋遍历二维数组?(修订版)_Java_03

​漫画:如何螺旋遍历二维数组?(修订版)_Java_04



​漫画:如何螺旋遍历二维数组?(修订版)_Java_05什么意思呢?我们来举个例子,给定下面这样一个二维数组:​漫画:如何螺旋遍历二维数组?(修订版)_Java_06



我们需要从左上角的元素1开始,按照顺时针进行螺旋遍历,一直遍历完所有的元素,遍历的路径就像下图一样:


​漫画:如何螺旋遍历二维数组?(修订版)_Java_07


经过这样的遍历,返回的元素结果如下:


1,2,3,4,5,10,15,20,19,18,17,16,11,6,7,8,9,14,13,12​漫画:如何螺旋遍历二维数组?(修订版)_Java_08

​漫画:如何螺旋遍历二维数组?(修订版)_Java_09


​漫画:如何螺旋遍历二维数组?(修订版)_Java_10


​漫画:如何螺旋遍历二维数组?(修订版)_Java_11

————————————

​漫画:如何螺旋遍历二维数组?(修订版)_Java_12



​漫画:如何螺旋遍历二维数组?(修订版)_Java_13




​漫画:如何螺旋遍历二维数组?(修订版)_Java_14

​漫画:如何螺旋遍历二维数组?(修订版)_Java_15



​漫画:如何螺旋遍历二维数组?(修订版)_Java_16

​漫画:如何螺旋遍历二维数组?(修订版)_Java_17








第1层

从左到右遍历“上边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_18




从上到下遍历“右边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_19




从右到左遍历“下边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_20




从下到上遍历“左边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_21




第2层

从左到右遍历“上边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_22




从上到下遍历“右边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_23




从右到左遍历“下边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_24



从下到上遍历“左”: ​漫画:如何螺旋遍历二维数组?(修订版)_Java_25



第3层

从左到右遍历“上边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_26




从上到下遍历“右边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_27




从右到左遍历“下边”:​漫画:如何螺旋遍历二维数组?(修订版)_Java_28




第三层的“左边”已无需遍历,二维数组到此遍历完毕。​漫画:如何螺旋遍历二维数组?(修订版)_Java_29​漫画:如何螺旋遍历二维数组?(修订版)_Java_30


​漫画:如何螺旋遍历二维数组?(修订版)_Java_31​漫画:如何螺旋遍历二维数组?(修订版)_Java_32

​漫画:如何螺旋遍历二维数组?(修订版)_Java_33

​漫画:如何螺旋遍历二维数组?(修订版)_Java_34

​漫画:如何螺旋遍历二维数组?(修订版)_Java_35



在上面的代码中,一个大循环当中包含了4个小循环。大循环控制了每一层的遍历,4个小循环分别实现了同一层上边、右边、下边,左边的遍历。


当遍历到最内层时,4个小循环并不会全都执行,比如测试代码中matrix2的最内层就只有一列,此时只需要遍历“上边”和“右边”。


这种情况下,遍历“下边”和“左边”的小循环必须加上了额外的条件限制:

(m-1)-i>i

i<(n-1)-i

使得同一条边不会被重复遍历到。​漫画:如何螺旋遍历二维数组?(修订版)_Java_36

​漫画:如何螺旋遍历二维数组?(修订版)_Java_37




—————END—————