54. 螺旋矩阵(LeetCode)(思维)

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;
    }
};
posted @ 2025-03-12 20:34  awei040519  阅读(13)  评论(0)    收藏  举报