【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;
    }
};
相关推荐
其实防守也摸鱼13 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt14 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one17 小时前
递归算法(一)
java·开发语言·算法
圣保罗的大教堂17 小时前
leetcode 3736. 最小操作次数使数组元素相等 III 简单
leetcode
文丑颜不良啊17 小时前
LeetCode1881~1990题目解析
java·leetcode
风影同志7832418 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG19 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者19 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者20 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品