【LeetCode热题100】【矩阵】螺旋矩阵

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

先走外面的圈再走里面的圈,可以用递归来解决,对于要走的一个圈,由四个角决定,其实是三个数,(0,0),(0,n),(m,0),(m,n),每次先从左上角走到右上角,再走到右下角,再走到左下角,再走回来

对于后面两个的往回走要在m和n不等于起点的情况下,否则会重复最后

复制代码
class Solution {
public:
    vector<int> ans;
    vector<vector<int> > matrix;

    void go(int start, int row, int column) {
        if (start > row || start > column)
            return;
        for (int i = start; i <= column; ++i)
            ans.push_back(matrix[start][i]);
        for (int i = start + 1; i <= row; ++i)
            ans.push_back(matrix[i][column]);
        if (row != start)
            for (int i = column - 1; i >= start; --i)
                ans.push_back(matrix[row][i]);
        if (column != start)
            for (int i = row - 1; i > start; --i)
                ans.push_back(matrix[i][start]);
        go(start + 1, row - 1, column - 1);
    }

    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        this->matrix = move(matrix);
        go(0, this->matrix.size() - 1, this->matrix[0].size() - 1);
        return ans;
    }
};

不用递归也可以,改成迭代

复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> ans;
        int start = 0, row = matrix.size() - 1, column = matrix[0].size() - 1;
        while (true) {
            if (start > row || start > column)
                break;
            for (int i = start; i <= column; ++i)
                ans.push_back(matrix[start][i]);
            for (int i = start + 1; i <= row; ++i)
                ans.push_back(matrix[i][column]);
            if (row != start)
                for (int i = column - 1; i >= start; --i)
                    ans.push_back(matrix[row][i]);
            if (column != start)
                for (int i = row - 1; i > start; --i)
                    ans.push_back(matrix[i][start]);
            ++start;
            --row;
            --column;
        }
        return ans;
    }
};
相关推荐
夏鹏今天学习了吗4 小时前
【LeetCode热题100(87/100)】最小路径和
算法·leetcode·职场和发展
哈哈不让取名字5 小时前
基于C++的爬虫框架
开发语言·c++·算法
Lips6117 小时前
2026.1.20力扣刷题笔记
笔记·算法·leetcode
2501_941329727 小时前
YOLOv8-LADH马匹检测识别算法详解与实现
算法·yolo·目标跟踪
洛生&7 小时前
Planets Queries II(倍增,基环内向森林)
算法
小郭团队7 小时前
1_6_五段式SVPWM (传统算法反正切+DPWM2)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·matlab·dsp开发
小郭团队7 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
鱼跃鹰飞8 小时前
Leetcode347:前K个高频元素
数据结构·算法·leetcode·面试
bybitq8 小时前
LeetCode236-二叉树的最近公共祖先(LCA)问题详解-C++
算法·深度优先
啊阿狸不会拉杆8 小时前
《数字图像处理》第 7 章 - 小波与多分辨率处理
图像处理·人工智能·算法·计算机视觉·数字图像处理