1 public class Solution {
2 public ArrayList<Integer> spiralOrder(int[][] matrix) {
3 // IMPORTANT: Please reset any member data you declared, as
4 // the same Solution instance will be reused for each test case.
5 ArrayList<Integer> result = new ArrayList<Integer>();
6 if(matrix == null||matrix.length == 0)
7 return result;
8 int m = matrix.length;
9 int n = matrix[0].length;
10 spiralRecur(matrix, 0, result, m, n);
11 return result;
12 }
13
14 private void spiralRecur(int[][] matrix, int layer, ArrayList<Integer> result, int m, int n){
15 int mlen = m - 2 * layer;
16 int nlen = n - 2 * layer;
17
18 if(mlen <= 0 || nlen <= 0)
19 return;
20 if(mlen == 1 && nlen == 1)
21 result.add(matrix[layer][layer]);
22 else if(mlen == 1){
23 for(int i = 0; i < nlen; i++)
24 result.add(matrix[layer][layer + i]);
25 }
26 else if(nlen == 1){
27 for(int i = 0; i < mlen; i++)
28 result.add(matrix[layer + i][layer]);
29 }
30 else{
31
32 for(int i = 0; i < nlen - 1; i++)
33 result.add(matrix[layer][layer + i]);
34
35 for(int i = 0; i < mlen - 1; i++)
36 result.add(matrix[layer + i][layer + nlen - 1]);
37
38 for(int i = 0; i < nlen - 1; i++)
39 result.add(matrix[layer + mlen - 1][layer + nlen - 1 - i]);
40
41 for(int i = 0; i < mlen - 1; i++)
42 result.add(matrix[layer + mlen - 1 - i][layer]);
43 }
44 spiralRecur(matrix, layer + 1, result, m ,n);
45 }
46 }