給定 m×n 矩陣,按順時針螺旋順序返回所有元素。
例:[[1,2,3],[4,5,6],[7,8,9]] → [1,2,3,6,9,8,7,4,5]
維護四個方向:右(0)→下(1)→左(2)→上(3)。用 visited 標記已走過的格子。當下一步越界或已訪問,順時針轉向。直到無法移動(所有格子已訪問)。
public ListspiralOrder(int[][] a) { List res = new ArrayList<>(); if (a.length == 0) return res; int t = 0, b = a.length-1, l = 0, r = a[0].length-1; while (t <= b && l <= r) { for (int j = l; j <= r; ++j) res.add(a[t][j]); t++; for (int i = t; i <= b; ++i) res.add(a[i][r]); r--; if (t <= b) for (int j = r; j >= l; --j) res.add(a[b][j]); b--; if (l <= r) for (int i = b; i >= t; --i) res.add(a[i][l]); l++; } return res; }
時間 O(mn),空間 O(mn) 或 O(1)(不計輸出)。邊界收縮法更優雅,無需額外 visited 數組。