54.Spiral Matrix

给定一个二维数组,将数组中的元素按照螺旋顺序输出,顺时针螺旋。

Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]

思路:
使用迷宫遍历,设定寻路的方向,当碰壁了,就换到下一个方向,但是要将已经走过的点标记出来,使用 0 标记。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.empty() || matrix[0].size() == 0) return {};
        vector<int> res;
        int m = matrix.size(), n = matrix[0].size(), i = 0, j = 0, idx = 0;
        int c[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };
        for (int k = 0; k < m * n; k++) {
            res.push_back(matrix[i][j]);
            matrix[i][j] = 0;
            int x = i + c[idx][0];
            int y = j + c[idx][1];
            if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] == 0) {
                idx = (idx + 1) % 4;
                x = i + c[idx][0];
                y = j + c[idx][1];
            }
            i = x; j = y;
        }
        return res;
    }
};

 

二、使用坐标顺序读取的方式,设定上下左右的坐标,每次读完就更新坐标。如:二维数组为 m*n的数组,则: up = 0, down = m-1, left = 0, right = n-1; 每次读完一个顺序,就将对应的 up +1 , right -1, down -1 ,left +1, 并随时判断是否满足条件: up <= down, left <= right 的要求。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.empty() || matrix[0].size() == 0) return {};
        vector<int> res;
        int m = matrix.size(), n = matrix[0].size();
        int up = 0, down = m - 1, left = 0, right = n - 1;
        while (true) {
            for (int j = left; j <= right; j++) res.push_back(matrix[up][j]);
            if (++up > down) break;
            for (int j = up; j <= down; j++) res.push_back(matrix[j][right]);
            if (--right < left) break;
            for (int j = right; j >= left; j--) res.push_back(matrix[down][j]);
            if (--down < up) break;
            for (int j = down; j >= up; j--) res.push_back(matrix[j][left]);
            if (++left > right) break;
        }
        return res;
    }
};

 

posted @ 2020-05-28 22:59  星海寻梦233  阅读(122)  评论(0编辑  收藏  举报