使用四个变量表示要遍历的上下左右四个边界,使用 visited 标记遍历过的位置并防止重复遍历。

在每次遍历中,依次遍历左、下、右、上边界并缩小边界范围

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param matrix int整型vector<vector<>>
     * @return int整型vector
     */
    vector<int> spiralOrder(vector<vector<int> >& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        vector<int> ans;
        vector<vector<bool>> visited(m, vector<bool>(n, false));
        // 遍历的上下左右四个边界
        int left = 0, right = n - 1, top = 0, bottom = m - 1;
        while (left <= right && top <= bottom) {
            // 遍历左边界
            for (int i = top; i <= bottom; i++) {
                if (!visited[i][left]) {
                    ans.emplace_back(matrix[i][left]);
                    visited[i][left] = true;
                }
            }
            left++;
            // 遍历下边界
            for (int i = left; i <= right; i++) {
                if (!visited[bottom][i]) {
                    ans.emplace_back(matrix[bottom][i]);
                    visited[bottom][i] = true;
                }
            }
            bottom--;
            // 遍历右边界
            for (int i = bottom; i >= top; i--) {
                if (!visited[i][right]) {
                    ans.emplace_back(matrix[i][right]);
                    visited[i][right] = true;
                }
            }
            right--;
            // 遍历上边界
            for (int i = right; i >= left; i--) {
                if (!visited[top][i]) {
                    ans.emplace_back(matrix[top][i]);
                    visited[top][i] = true;
                }
            }
            top++;
        }
        return ans;
    }
};

时间复杂度:O(m * n),相当于遍历了数组中每个元素1次

空间复杂度:O(m * n),存储visited数组