今天我的同事去面试的时候被问到了一道题目,非常经典的一道题,请用二维数组顺时针螺旋遍历矩阵的思路,当时我同事可能就说 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个小循环控制着同一层上边、右边、下边,左边的遍历。
本文介绍了一种经典的二维数组遍历方法——顺时针螺旋遍历,并详细解释了其实现思路与过程。通过将二维数组想象成多个由外向内的层次,文章提供了直观的图形辅助理解,并附带了具体的Java实现代码。
1014

被折叠的 条评论
为什么被折叠?



