[leetcode] problem 54 – spiral matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Example

No.1

Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]

Output: [1,2,3,6,9,8,7,4,5]

No.2

Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]

Output: [1,2,3,4,8,12,11,10,9,5,6,7]

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public List<Integer> (int[][] matrix) {
List<Integer> result = new ArrayList<>();

if (matrix == null || matrix.length == 0)
return result;

int m = matrix.length;
int n = matrix[0].length;
int start = 0;

while (2 * start < m && 2 * start < n) {
spiralOrderHelper(result, matrix, m, n, start);
start++;
}

return result;
}

private void spiralOrderHelper(List<Integer> result, int[][] matrix, int m, int n, int start) {
int endX = n - 1 - start;
int endY = m - 1 - start;

for (int i = start; i <= endX; i++)
result.add(matrix[start][i]);

if (endY > start) {
for (int i = start + 1; i <= endY; i++)
result.add(matrix[i][endX]);
}

if (endY > start && endX > start) {
for (int i = endX - 1; i >= start; i--)
result.add(matrix[endY][i]);
}

if (endY > start + 1 && endX > start) {
for (int i = endY - 1; i > start; i--)
result.add(matrix[i][start]);
}
}