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

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

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

螺旋矩阵遍历思路以及计算,考验你的时候到了_第1张图片

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

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

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

螺旋矩阵遍历思路以及计算,考验你的时候到了_第2张图片
我们只要按照顺序从外向内一层层的遍历,就等于是对二维数组进行了螺旋遍历

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

第一层:上边从左到右

螺旋矩阵遍历思路以及计算,考验你的时候到了_第3张图片

第一层:右边从上到下

螺旋矩阵遍历思路以及计算,考验你的时候到了_第4张图片

第一层:下边从右到左

螺旋矩阵遍历思路以及计算,考验你的时候到了_第5张图片
第一层:左边从下到上

螺旋矩阵遍历思路以及计算,考验你的时候到了_第6张图片

第二层:上边从左到右
螺旋矩阵遍历思路以及计算,考验你的时候到了_第7张图片

第二层:右边从上到下

螺旋矩阵遍历思路以及计算,考验你的时候到了_第8张图片

第二层:下边从右到左

螺旋矩阵遍历思路以及计算,考验你的时候到了_第9张图片
第二层左边已经没有了,所以不需要在遍历了。

所以最后的实现如下图:

螺旋矩阵遍历思路以及计算,考验你的时候到了_第10张图片
按照以上的思路我们用代码来实现一下:

	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个小循环控制着同一层上边、右边、下边,左边的遍历。

你可能感兴趣的:(java,数组)