leetcode热题100(54. 螺旋矩阵)c++

发布于:2025-02-11 ⋅ 阅读:(33) ⋅ 点赞:(0)

链接:54. 螺旋矩阵 - 力扣(LeetCode)

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

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

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

思路

因为顺时针遍历,最简单的想法就是dfs遍历一遍,只要我们遇到边界条件或已经遍历过的点,直接换一个方向接着遍历即可,只会存在一个方法是没遍历过的,直到容器的大小为n*m那么说明整个数组已经遍历了一遍

代码

class Solution {
public:
    int st[12][12];
    int dx[4]={-1,0,1,0};
    int dy[4]={0,-1,0,1};
    int n,m;
    vector<int> res;
    vector<int> spiralOrder(vector<vector<int>>& g) {
        n = g.size();
        m = g[0].size();
        st[0][0]=true;
        res.push_back(g[0][0]);
        dfs(0,0,3,g);
        return res;
    }

    void dfs(int x,int y,int op,vector<vector<int>>& g){
        if(res.size()>=n*m) return;
        int tx = x+dx[op];
        int ty = y+dy[op];
        if(tx<0||tx>=n||ty<0||ty>=m||st[tx][ty]){
            for(int i=0;i<4;i++){
                tx = x+dx[i];
                ty = y+dy[i];
                if(tx<0||tx>=n||ty<0||ty>=m||st[tx][ty]) continue;
                else{
                    res.push_back(g[tx][ty]);
                    st[tx][ty]=true;
                    dfs(tx,ty,i,g);
                    return;
                }
            }
        }else{
            res.push_back(g[tx][ty]);
            st[tx][ty]=true;
            dfs(tx,ty,op,g);
        }
    }

};


网站公告

今日签到

点亮在社区的每一天
去签到