54. 螺旋矩阵

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<int> res;
        // 定义四个方向的边界:左、右、上、下
        int left = 0 , right = n - 1;
        int top = 0, down = m - 1;

        // 当左边界不超过右边界,且上边界不超过下边界时,循环继续
        while (left <= right && top <= down) {
            // 从左到右填充上边界的行
            for (int i = left; i <= right; i++) {
                res.push_back(matrix[top][i]);
            }
            top++; // 上边界下移

            // 从上到下填充右边界的列
            for (int i = top; i <= down; i++) {
                res.push_back(matrix[i][right]);
            }
            right--; // 右边界左移

            // 从右到左填充下边界的行
            if (top <= down) { // 添加检查以避免重复
                for (int i = right; i >= left; i--) {
                    res.push_back(matrix[down][i]);
                }
                down--; // 下边界上移
            }

            // 从下到上填充左边界的列
            if (left <= right) { // 添加检查以避免重复
                for (int i = down; i >= top; i--) {
                    res.push_back(matrix[i][left]);
                }
                left++; // 左边界右移
            }
        }

        // 返回填充完成的矩阵
        return res;

    }
};