螺旋矩阵遍历思路以及计算,考验你的时候到了

本文介绍了一种经典的二维数组遍历方法——顺时针螺旋遍历,并详细解释了其实现思路与过程。通过将二维数组想象成多个由外向内的层次,文章提供了直观的图形辅助理解,并附带了具体的Java实现代码。

今天我的同事去面试的时候被问到了一道题目,非常经典的一道题,请用二维数组顺时针螺旋遍历矩阵的思路,当时我同事可能就说 why?弄啥嘞,在这里我也了解了一下,把自己的思路写下来吧。

首先最终实现二维数组顺时针螺旋图:

在这里插入图片描述

经过遍历返回的数组值:
在这里插入图片描述

那实现这个的思路又是怎么做到的呢,接下来我们就开始讲解

细心的小伙伴有没有发现,每一层的指针的方向都不同,我们可以把这种四方形想象成一个回字,如下图:

在这里插入图片描述
我们只要按照顺序从外向内一层层的遍历,就等于是对二维数组进行了螺旋遍历

那到底是怎样一层一层遍历的呢?那就是把二维数组的每一层分成上下左右4个边,如下图

第一层:上边从左到右

在这里插入图片描述

第一层:右边从上到下

在这里插入图片描述

第一层:下边从右到左

在这里插入图片描述
第一层:左边从下到上

在这里插入图片描述

第二层:上边从左到右
在这里插入图片描述

第二层:右边从上到下

在这里插入图片描述

第二层:下边从右到左

在这里插入图片描述
第二层左边已经没有了,所以不需要在遍历了。

所以最后的实现如下图:

在这里插入图片描述
按照以上的思路我们用代码来实现一下:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		  int[][] array = {{ 1,  2,  3,  4,  5  },{ 6,  7,  8,  9,  10 },{ 11, 12, 13, 14, 15 },{ 16, 17, 18, 19, 20 }};
		  List<Integer> list = new ArrayList<Integer>();
	        // m:行数
	        int m = array.length;
	        
	        // n:列数
	        int n = array[0].length;
	        
	        // 二维数组的层数
	        int size = (Math.min(m, n)+1)/2;
	        
	        // 从外向内逐层遍历矩阵
	        for(int i=0; i<size; i++) {
	            // 上边从左到右遍历
	            for (int j=i; j<n-i; j++) {
	                list.add(array[i][j]);
	            }
	            
	            // 右边从上到下遍历
	            for (int j=i+1; j<m-i; j++) {
	                list.add(array[j][(n-1)-i]);
	            }
	            
	            // 下边从右到左遍历
	            for (int j=i+1; j<n-i && (m-1)-i>i; j++) {
	                list.add(array[(m-1)-i][(n-1)-j]);
	            }
	            
	            // 左边从下到上遍历
	            for (int j=i+1; j<m-1-i && i<(n-1)-i; j++) {
	                list.add(array[(m-1)-j][i]);
	            }
	        }
	        System.out.println(list.toArray());
	}

上面一个循环包括了4个循环,最大的循环控制着每一层的遍历,4个小循环控制着同一层上边、右边、下边,左边的遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值