class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> result;
        // 处理空矩阵的情况
        if (matrix.empty() || matrix[0].empty()) {
            return result;
        }
        
        int m = matrix.size();    // 行数
        int n = matrix[0].size(); // 列数
        
        // 定义四个边界
        int top = 0, bottom = m - 1;
        int left = 0, right = n - 1;
        
        while (top <= bottom && left <= right) {
            // 从左到右遍历上边界
            for (int j = left; j <= right; j++) {
                result.push_back(matrix[top][j]);
            }
            top++;
            
            // 从上到下遍历右边界
            for (int i = top; i <= bottom; i++) {
                result.push_back(matrix[i][right]);
            }
            right--;
            
            // 检查是否还有行需要遍历
            if (top <= bottom) {
                // 从右到左遍历下边界
                for (int j = right; j >= left; j--) {
                    result.push_back(matrix[bottom][j]);
                }
                bottom--;
            }
            
            // 检查是否还有列需要遍历
            if (left <= right) {
                // 从下到上遍历左边界
                for (int i = bottom; i >= top; i--) {
                    result.push_back(matrix[i][left]);
                }
                left++;
            }
        }
        
        return result;
    }
};

算法思路:

  1. 边界定义:使用四个变量top、bottom、left、right来定义当前需要遍历的矩阵范围。
  2. 螺旋遍历:从左到右遍历上边界,然后上边界下移(top++)从上到下遍历右边界,然后右边界左移(right--)从右到左遍历下边界,然后下边界上移(bottom--)从下到上遍历左边界,然后左边界右移(left++)
  3. 终止条件:当上边界超过下边界或左边界超过右边界时,遍历结束。
  4. 边界检查:在遍历下边界和左边界前需要检查是否还有有效的行或列需要遍历,避免重复遍历。

复杂度分析:

  • 时间复杂度:O(m × n),每个元素恰好被访问一次
  • 空间复杂度:O(1),除了存储结果的数组外,只使用了常数级别的额外空间