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; } }