题目:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]You should return
[1,2,3,6,9,8,7,4,5]
.
在《剑指OFFER》中有该题目的类似题,题目的意思是按照螺旋形状的输出一个二维数组的值,如下图所示:
值得思考的有两点:
1. 每次遍历一圈数组的时候,第一个元素的位置都是(0,0),(1,1),(2,2)这样(x,y)满足x==y的点,所以可以根据start的位置判断要不要继续遍历新一圈。
2.遍历一圈的过程可以分为四个部分,从左往右->从上往下->从右往左->从下往上,所以要针对四个方向都能进行判断,如下图:
从左往右:可以直接从左往右遍历
从上往下:当前矩阵至少有两行
从右往左:当前矩阵至少有两行、两列
从下往上:当前矩阵至少有三行、两列
java代码:
public List<Integer> spiralOrder(int[][] matrix) {
if (matrix == null) {
return null;
}
List<Integer> list = new ArrayList<Integer>();
if (matrix.length == 0) {
return list;
}
int m = matrix.length;
int n = matrix[0].length;
for (int i = 0; i < (m + 1) / 2 && i < (n + 1) / 2; i++) {
int start = i;
for (int j = start; j < n - start; j++) {
list.add(matrix[start][j]);
}
if ((m - 2 * start) / 2 >= 1) {
for (int j = start + 1; j < m - start; j++) {
list.add(matrix[j][n - start - 1]);
}
}
if (((m - 2 * start) / 2 >= 1) && (n - start) >= 2) {
for (int j = n - start - 2; j >= start; j--) {
list.add(matrix[m - start - 1][j]);
}
}
if ((m - 2 * start) >= 3 && (n - start) >= 2) {
for (int j = m - start - 2; j > start; j--) {
list.add(matrix[j][start]);
}
}
}
return list;
}