知识点

模拟

思路

我们模拟一下运动的过程,开始从(0,0)出发向下,一旦遇到边界或者访问过的位置就逆时针转向即可。

时间复杂度 O(nm)

AC Code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix int整型vector<vector<>> 
     * @return int整型vector
     */
    int dx[4] = {1, 0, -1, 0};
    int dy[4] = {0, 1, 0, -1};
    vector<int> spiralTravelCounterClockwise(vector<vector<int> >& matrix) {
        vector<int> res;
        int n = matrix.size(), m = matrix[0].size();
        int k = 0, x = 0, y = 0;
        for (int i = 0; i < n * m; i ++) {
            res.push_back(matrix[x][y]);
            matrix[x][y] = 0;
            if (x + dx[k] < 0 or x + dx[k] >= n or y + dy[k] < 0 or y + dy[k] >= m or !matrix[x + dx[k]][y + dy[k]]) k = (k + 1) % 4;
            x += dx[k];
            y += dy[k]; 
        }
        return res;
    }
};