Return all elements of an m × n matrix in spiral order, going clockwise from the top-left corner.
Walk right, down, left, up in turn. Turn clockwise whenever the next cell is outside the grid or already visited.
1function spiralOrder(matrix: number[][]): number[] {2const m = matrix.length, n = matrix[0].length, out: number[] = [];3const seen = matrix.map((row) => row.map(() => false));4const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];5let r = 0, c = 0, d = 0;6for (let k = 0; k < m * n; k++) {7out.push(matrix[r][c]); seen[r][c] = true;8const [nr, nc] = [r + dirs[d][0], c + dirs[d][1]];9if (nr < 0 || nc < 0 || nr >= m || nc >= n || seen[nr][nc]) d = (d + 1) % 4;10r += dirs[d][0]; c += dirs[d][1];11}12return out;13}
| 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 |
Start at (0, 0) heading right.
Space: play/pause · ←/→: step