# LC 54. Spiral Matrix ### [Problem link](https://leetcode.com/problems/spiral-matrix/) ###### tags: `leedcode` `medium` `python` `c++` `DFS` `Math` Given an <code>m x n</code> <code>matrix</code>, return all elements of the <code>matrix</code> in spiral order. **Example 1:** <img alt="" src="https://assets.leetcode.com/uploads/2020/11/13/spiral1.jpg" style="width: 242px; height: 242px;" /> ``` Input: matrix = [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] ``` **Example 2:** <img alt="" src="https://assets.leetcode.com/uploads/2020/11/13/spiral.jpg" style="width: 322px; height: 242px;" /> ``` Input: matrix = [[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] ``` **Constraints:** - <code>m == matrix.length</code> - <code>n == matrix[i].length</code> - <code>1 <= m, n <= 10</code> - <code>-100 <= matrix[i][j] <= 100</code> ## Solution 1 - DFS #### Python ```python= class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: q = deque([(0,0)]) res = [matrix[0][0]] matrix[0][0] = "F" direction = [[0,1], [1,0], [0,-1], [-1,0]] # [right, down, left, up] dir_idx = 0 while q: x, y = q.pop() for i in range(len(direction)): dx, dy = direction[dir_idx] new_x, new_y = x + dx, y + dy if 0 <= new_x < len(matrix) and 0 <= new_y < len(matrix[0]) and matrix[new_x][new_y] != "F": q.append((new_x, new_y)) res.append(matrix[new_x][new_y]) matrix[new_x][new_y] = "F" break else: dir_idx = (dir_idx + 1) % len(direction) return res ``` ## Solution 2 #### Python ```python= class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: left, right, up, down = 0, len(matrix[0]) - 1, 0, len(matrix) - 1 direction = 0 res = [] while left <= right and up <= down: if direction == 0: # right for i in range(left, right + 1): res.append(matrix[up][i]) up += 1 elif direction == 1: # down for i in range(up, down + 1): res.append(matrix[i][right]) right -= 1 elif direction == 2: # left for i in range(right, left - 1, -1): res.append(matrix[down][i]) down -= 1 else: # up for i in range(down, up - 1, -1): res.append(matrix[i][left]) left += 1 direction = (direction + 1) % 4 return res ``` #### C++ ```cpp= class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { int rows = matrix.size(), cols = matrix[0].size(); int up = 0, down = rows - 1, left = 0, right = cols - 1; int dir = 0; vector<int> res; while (left <= right and up <= down) { if (dir == 0) { for (int i = left; i <= right; i++) { res.push_back(matrix[up][i]); } up++; } else if (dir == 1) { for (int i = up; i <= down; i++) { res.push_back(matrix[i][right]); } right--; } else if (dir == 2) { for (int i = right; i >= left; i--) { res.push_back(matrix[down][i]); } down--; } else { for (int i = down; i >= up; i--) { res.push_back(matrix[i][left]); } left++; } dir = (dir + 1) % 4; } return res; } }; ``` >### Complexity >m = matrix.length >n = matrix[i].length >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(mn) | O(mn) | >| Solution 2 | O(mn) | O(mn) | ## Note x