给定一个二维数组:
要求:按照如下的顺序遍历该二维数组:
大家有没有发现这个二位数组像我们汉字中的“回” 字;
这说明啥?我们可以把"回"字看成一个大矩形包裹一个小矩形 ,由外到内层层嵌套起来,并且可能不只有两层。
我们可以把一个矩形看成是由四条边组成的,分别是:上边,右边,下边,左边;
第一层:
从左到右:"上边"
从上到下:“右边”
从右到左:“下边”
从下到上:左边
第二层:
从左到右:"上边"
从上到下:“右边”
从右到左:“下边”
从下到上:左边
.....
直到遍历完第n层结束。
注意事项:如果最内层只剩下一行或一列的时候,最内层遍历的不在是上,下,左,右四条边了。
比如说,只有一列的时候,只需要遍历上边和右边,在这种情况下我们要在给遍历左边和下边添加一下条件:
(m-1)-i>i
i>(n-1)-i
代码实现:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SpiralOrder {
public static List<Integer> spiralOrder(int[][] matrix){
List<Integer> list=new ArrayList<>();
if(matrix==null||matrix.length==0||matrix[0].length==0){
return list;
}
//二维数组行数
int m=matrix.length;
//二维数组列数
int n=matrix[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(matrix[i][j]);
}
//从上向下遍历:“右边”
for(int j=i+1;j<m-i;j++){
list.add(matrix[j][n-i-1]);
}
//从右向左遍历:"下边"
for(int j=i+1;j<n-i&&(m-i-1)>i;j++){
list.add(matrix[m-i-1][n-j-1]);
}
//从下向上遍历:"左边"
for(int j=i+1;j<m-i-1&&(n-i-1)>i;j++){
list.add(matrix[m-j-1][i]);
}
}
return list;
}
public static void main(String[] args) {
int[][] matrix={
{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}
};
List<Integer> resultList=spiralOrder(matrix);
System.out.println(Arrays.toString(resultList.toArray()));
}
}
活动地址:CSDN21天学习挑战赛