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].
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> r = new ArrayList<Integer>();
if (matrix == null || matrix.length == 0) return r;
int endrow = matrix.length-1,beginrow = 0;
int endcol = matrix[0].length-1,begincol = 0;
while(beginrow <= endrow && begincol <= endcol){
for(int i = begincol;i <= endcol;i++){
r.add(matrix[beginrow][i]);
}
beginrow++;
for(int i = beginrow;i <= endrow;i++){
r.add(matrix[i][endcol]);
}
endcol--;
if(endrow >= beginrow){ //避免加入同一行
for(int i = endcol;i >= begincol;i--){
r.add(matrix[endrow][i]);
}
}
endrow--;
if(begincol <= endcol){ //避免加入同一列
for(int i = endrow;i >= beginrow;i--){
r.add(matrix[i][begincol]);
}
}
begincol++;
}
return r;
}
}
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
public int[][] generateMatrix(int n) {
int[][] r = new int[n][n];
int begin = 0,end = n-1;
int num = 1;
while(begin < end){
for(int i = begin;i <= end;i++){
r[begin][i] = num++;
}
for(int i = begin+1;i <= end;i++){
r[i][end] = num++;
}
for(int i = end-1;i >= begin;i--){
r[end][i] = num++;
}
for(int i = end-1;i >= begin+1;i--){
r[i][begin] = num++;
}
begin++;
end--;
}
if(begin == end) r[begin][end] = num;
return r;
}