在周一发布的漫画中,肖辉忽略了一个小问题:当二维数组的最内层只有一行或一列时,可能会反复访问螺旋遍历。
因此,必须在第3和第4个小循环中添加其他条件。
今天发布了修订版以修复此缺陷。
谢谢大家的指正。
—————第二天——————你是什么意思?让我们以下面的二维数组为例:我们需要从左上角的元素1开始顺时针螺旋遍历,一直遍历所有元素,遍历路径如下图所示:在此遍历之后,返回的元素结果如下:1,2,3,4,5,10,15,20,19,18,17,16,16,11,6,7,8,9,14 、、 13、12-——————————等级1遍历“顶部”从左到右:遍历“右侧”从上到下:遍历“底部”从右到左:遍历“左”从底部到顶部:否。
第2层穿过“上”层。
从左到右:遍历“右”从上到下:遍历“底部”从右到左:遍历“左”从底部到顶部:遍历“顶部”。
在第3层上从左向右移动:从上到下:遍历“底部”从右到左:“左”第三层的“层”不再需要遍历,而二维数组也已遍历。
public class SpiralOrder {public static ListspiralOrder(int [] [] matrix){List list = new ArrayList(); //当二维数组为空或任意维为0时,如果n(matrix == matrix),则直接返回。
length = = 0 || matrix [0] .length = = 0){返回列表; // m是矩阵的行数=矩阵数。
长度; int m = matrix.length的数量; int m = matrix.length的数量; int m = matrix.length的数量; [0] .length; //二维数组的层数取决于行和列的较小值int size =(Math.min(m,n)+1)/ 2;大循环,从外到内遍历for(int i = 0; i //从左到右遍历“ top”,用于(int j = i; j到bottom / list.j(matrix) ;为list.j(matrix)遍历for(int j = i + 1; j list.add(matrix [j] [(n-1)-i]);遍历“ for i”。
从右边到左边+1; j1)-i> i; j ++){list.add(matrix [(m-1)-i] [(n-1)-j]);从下到上遍历“用于”(int j = i + 1; j1-i& i1)-i; j ++){list.add(matrix [(m-1)-j] [i]);无效列表静态;返回public in(String [] args){int [] []矩阵= {1、2、3、4、5、11、12、9、6、7},{16、17、18、19、20} }; int [] [] matrix2 = {{1,2,3},{4,5,6},{7,8,9},{10,11,12 ,,,,,,,,,,,,, ,,,,,,, The SpiralOrder(matrix);, Array,spiralOrder,(matrix),;数组,螺旋,阶数(矩阵); Array,Array,(),System。
,out。
,Println,(Arrays,to String ,, System。
out.println(Arrays.toString(resultList2.toArray()));}}在上面的代码中,大循环包含4个小循环,大循环控制每一层的遍历,这4个小循环分别实现同一层的上,右,下和左侧的遍历。
不会执行4个小循环,例如,测试代码中matrix2的最内层只有一列,此时,您只需要遍历“ top”和“ right”。
穿过“底部”和“左侧”的小环必须服从附加条件:(m-1)-i> i1)-i,以使相同的边缘不会重复遍历。
————————————————喜欢这篇文章的朋友们,欢迎关注官方账户程序员小慧,并观看更多精彩内容。
点击[查找],这是对小辉的最大支持!