leetcode题解:螺旋矩阵

题目描述:

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix

题目分析:

本题主要考察二维矩阵的边界检查,简单遍历即可

第一思路:给定上下左右四个方向,依次进行循环,每个方向遍历结束则改变方向,同时该方向上大小减1

   // 使用一个二维数据来规定四个方向

   int dir[4][2] = {
   
   {0, 1}, {1, 0}, {0, -1}, {-1, 0}};

    int step[2] = {0};

    vector<int> spiralOrder(vector<vector<int>>& matrix) {

        vector<int> res;

        if(!matrix.size()){

            return res;

        }

        step[1] = matrix.size()-1;

        if(!matrix[0].size()){

            return res;

        }

        step[0] = matrix[0].size();

        int dir_idx = 0;

        int cur[2] = {0, -1};

        int flag = dir_idx % 2;

        while(step[flag]){       

            for(int i =0; i<step[flag]; i++){

                cur[0] = cur[0] + dir[dir_idx][0];

                cur[1] = cur[1] + dir[dir_idx][1];

                res.push_back(matrix[cur[0]][cur[1]]);

            }

            step[flag]--;

            dir_idx = (dir_idx + 1) % 4;

            flag = dir_idx % 2;

        }

        return res;

    }

优化实现:只需要对四个方向的最大值边界进行动态维护,即可快速进行螺旋遍历,当边界冲突退出    

vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if (matrix.empty()) return res;
        int up = 0, down = matrix.size() -1;
        int left = 0, right = matrix[0].size()-1;
        while(true){
            // 最上一行,从左往右
            for(int i = left; i<=right; i++) res.push_back(matrix[up][i]);
            if(++up > down) break;
            // 最右一行,从上往下
            for(int i = up; i<=down; i++) res.push_back(matrix[i][right]);
            if(--right < left) break;
            // 最下一行,从右往左
            for(int i = right; i>= left; i--) res.push_back(matrix[down][i]);
            if(--down < up) break;
            // 最左一行,从下往上
            for(int i = down; i>= up; i--) res.push_back(matrix[i][left]);
            if(++left > right) break;
        }
        return res;
    }

猜你喜欢

转载自blog.csdn.net/li6016265/article/details/108191349
今日推荐