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]
.
设置上下左右四个边界,绕着边界存入ArrayList便可得到Spiral Matrix。
具体做法:上界:遍历以上界为行号,左右边界为列号的元素。遍历结束后上界值加1,并于下界值作比较,若大于,则终止循环,即已遍历所有元素。
右界:遍历以右界为列号,上下边界为行号的元素。遍历结束后右界值减1,并于左界值作比较,若大于,则终止循环,即已遍历所有元素。
下界和左界情况与上界和右界相同。
http://www.blogjava.net/menglee/archive/2013/12/22/407874.html
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(matrix.length == 0) {
return res;
}
int m = matrix.length;
int n = matrix[0].length;
int up = 0;
int down = m - 1;
int left = 0;
int right = n - 1;
while(true) {
// up bound
for(int i=left; i<=right; i++) {
res.add(matrix[up][i]);
}
if(++up > down) break;
// right bound
for(int j=up; j<=down; j++) {
res.add(matrix[j][right]);
}
if(--right < left) break;
// bottom bound
for(int k=right; k>=left; k--) {
res.add(matrix[down][k]);
}
if(--down < up) break;
// left bound
for(int l=down; l>=up; l--) {
res.add(matrix[l][left]);
}
if(++left > right) break;
}
return res;
}
}