【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;
    }
};
相关推荐
靠沿9 小时前
贪心算法专题(三)
算法·贪心算法
super大力张10 小时前
MOE基于结构的药物设计(七):Ligand R-Vectors——如何判断配体可以从哪里继续生长?
数据库·算法·cadd·moe·svl·基于结构的药物设计
Tongsr11 小时前
别只混淆代码:用 Kaleido 加固整个 Android Release AAB
前端·算法·github
高亦真11 小时前
今天是学习嵌入式的第34天
linux·学习·算法
飞Link12 小时前
动作方法中的分割与过度分割方法全解析(含代码实战与踩坑案例)
人工智能·python·算法·计算机视觉
张宇Joaquin12 小时前
鲲鹏统一并行加速库KUPL--异步数据拷贝
线性代数·算法·矩阵·numpy
GlobalInfo12 小时前
创新不是追逐热点,是在变化中建立长期竞争力
大数据·算法
lvwangshu13 小时前
线性代数基础 Linear Algebra Basics
数学·算法
ZhouDevin13 小时前
算法论文/数据集5——AlignPrune(CVPR2026)基于样本损失时间序列精确识别噪声样本
算法
十铭忘14 小时前
HMM(隐马尔可夫模型)的理解7——Baum–Welch 算法
人工智能·算法