Spiral Matrix

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

Example 1:

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

Example 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]
Solution:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        int[] dx = new int[]{0,1,0,-1};
        int[] dy = new int[]{1,0,-1,0};
        int dir = 0;
        int l = 0;
        int u = 0;
        int m = matrix.length;
        if (m == 0) return result;
        int n = matrix[0].length;
        if (n == 0) return result;
        int size = m * n;
        int i = 0, j = 0;
        while (result.size() < size) {
            result.add(matrix[i][j]);
            if (dir == 0 && j == n - 1) {
                u ++;
                dir = 1;
            } else if (dir == 1 && i == m - 1) {
                n --;
                dir = 2;
            } else if (dir == 2 && j == l) {
                m --;
                dir = 3;
            } else if (dir == 3 && i == u) {
                l ++;
                dir = 0;
            }
            i += dx[dir];
            j += dy[dir];
        }
        return result;
    }
}