classSolution { public: vector<int> spiralOrder(vector<vector<int>> &matrix){ vector<pair<int, int>> dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int flag = 0, top = 0, left = 0; int down = matrix.size() - 1; int right = matrix[0].size() - 1; vector<int> ans; int i = 0, j = -1; while (top <= down && left <= right) { i += dir[flag].first; j += dir[flag].second; ans.push_back(matrix[i][j]); if (j == right && flag == 0) { top++; flag = 1; } elseif (i == down && flag == 1) { right--; flag = 2; } elseif (j == left && flag == 2) { down--; flag = 3; } elseif (i == top && flag == 3) { left++; flag = 0; } } return ans; } };