54. 螺旋矩阵
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if(matrix.empty()) return ans;
int u = 0, d = matrix.size() - 1, l = 0, r = matrix[0].size() - 1;
while(1){
for(int i = l; i <= r; i++) ans.push_back(matrix[u][i]);
if(++u > d) break;
for(int i = u; i <= d; i++) ans.push_back(matrix[i][r]);
if(--r < l) break;
for(int i = r; i >= l; i--) ans.push_back(matrix[d][i]);
if(--d < u) break;
for(int i = d; i >= u; i--) ans.push_back(matrix[i][l]);
if(++l > r) break;
}
return ans;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int m = matrix.size(), n = matrix[0].size();
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
vector<vector<bool>> st(m, vector<bool>(n, 0));
for(int i = 0, x = 0, y = 0, d = 0; i < n * m; ++i){
res.push_back(matrix[x][y]);
st[x][y] = true;
int xx = x + dx[d], yy = y + dy[d];
if(xx < 0 || yy < 0 || xx >= m || yy >= n || st[xx][yy]){
d = (d + 1) % 4;
xx = x + dx[d], yy = y + dy[d];
}
x = xx, y = yy;
}
return res;
}
};