Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
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]
.
public class Solution {
/**
* @param matrix a matrix of m x n elements
* @return an integer list
*/
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<Integer>();
if(matrix.length == 0) return res;
boolean breaked = false;
int i = 0, j = 0, width = matrix[0].length, height = matrix.length;
int layer = 0;
while(true) {
//if(layer > Math.min(width, height) / 2) break;有除法都要注意四舍五入带来的问题
if(j >= width - layer) break;//四个终止条件,如果开始搜索之前已经越界 则break
while(j < width - layer) {
res.add(matrix[i][j]);
j++;
}
j -= 1;
i += 1;
if(i >= height - layer) break;//四个终止条件,如果开始搜索之前已经越界 则break
while(i < height - layer) {
res.add(matrix[i][j]);
i++;
}
i -= 1;
j -= 1;
if(j < layer) break;//四个终止条件,如果开始搜索之前已经越界 则break
while(j >= layer) {
res.add(matrix[i][j]);
j--;
}
j += 1;
i -= 1;
if(i < layer + 1) break;//四个终止条件,如果开始搜索之前已经越界 则break
while(i >= layer + 1) {
res.add(matrix[i][j]);
i--;
}
i += 1;
j += 1;
layer += 1;
}
return res;
}
}