leetcode 54. 螺旋矩阵

2023-09-12 22:39:53

1. 题解

在这里插入图片描述

  • 如果一条边从头遍历到底,则下一条边遍历的起点随之变化
  • 选择不遍历到底,可以减小横向、竖向遍历之间的影响
  • 一轮迭代结束时,4条边的两端同时收窄 1
  • 一轮迭代所做的事情变得很清晰:遍历一个“圈”,遍历的范围收缩为内圈
  • 一层层向里处理,按顺时针依次遍历:上、右、下、左。
  • 不再形成“环”了,就会剩下:一行或一列,然后单独判断

矩阵不一定是方阵
top < bottom && left < right 是循环的条件
无法构成“环”了,就退出循环,退出时可能是这 3 种情况之一:

  • top == bottom && left < right —— 剩一行
  • top < bottom && left == right —— 剩一列
  • top == bottom && left == right —— 剩一项(也算 一行/列)
    处理剩下的单行或单列

因为是按顺时针推入结果数组的,所以

  • 剩下的一行,从左至右 依次推入结果数组
  • 剩下的一列,从上至下 依次推入结果数组

代码
每个元素访问一次,时间复杂度 O(m*n),m、n 分别是矩阵的行数和列数

2. 循环

class Solution {
public:
/*
    1. 坚持循环不变量原则,固定规则来遍历
    2. 
*/
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if (matrix.empty()) {
            return res;
        }

        int top = 0;
        int bottom = matrix.size() - 1;
        int left = 0;
        int right = matrix[0].size() - 1;

        while (left < right && top < bottom) {
            // 更新顶行
            for (int i = left; i < right; i++) {
                res.push_back(matrix[top][i]);
            }
            // 更新最右列
            for (int i = top; i < bottom; i++) {
                res.push_back(matrix[i][right]);
            }
            // 更新最底行
            for (int i = right; i > left; i--) {
                res.push_back(matrix[bottom][i]);
            }
            // 更新左列
            for (int i = bottom; i > top; i--) {
                res.push_back(matrix[i][left]);
            }
            left++;
            top++;
            right--;
            bottom--;
        }

        if (top == bottom) {
            for (int i = left; i <= right; i++) {
                res.push_back(matrix[top][i]);
            }
        } else if (left == right) {
            for (int i = top; i <= bottom; i++) {
                res.push_back(matrix[i][left]);
            }
        }

        return res;
    }
};
更多推荐

AI&DAO,将会引领我们走向何方?

人工智能(AI)和分布式自治组织(DAO)都是区块链赛道的热门项目之一,他们看似在不同的领域独立发展,然而,它们之间也存在着巨大的协同潜力。未来,AI有望成为推动DAO发展的重要动力,同时,DAO也可成为AI的最佳实验场所。DAO的下一波浪潮可能是AIDAO。释放生产力的未来首先,让我们来思考一下,AI如何在DAO中释

创建一个简单的外卖订餐系统

在今天的快节奏生活中,外卖订餐系统已经成为了人们日常生活中不可或缺的一部分。这些系统通过在线点餐和配送服务,为用户提供了便捷的用餐体验。在本文中,我们将创建一个简单的外卖订餐系统,使用Python和Flask框架构建后端,以及HTML、CSS和JavaScript构建前端。技术栈我们将使用以下技术栈来构建这个外卖订餐系

【基本数据结构 三】线性数据结构:栈

学习了数组和链表后,再来看看第三种线性表结构,也就是栈,栈和后边讲的队列一样是一种受限的线性表结构,正是因为其使用有限制,所以对于一些特定的需要操作可控的场合,受限的结构就非常有用。栈的定义我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。栈的结构后进者先出,

Rust认识所有权(4)

认识所有权1.认识所有权2.什么是所有权?2.1程序运行管理运行的方式2.2栈(Stack)和堆(Heap)1.栈(Stack)2.堆(Heap)2.3所有权规则2.4变量作用域2.4String类型2.5内存与分配1.以String类型为参考2.变量与数据交互的方式(一):移动2.1String版本3.变量与数据交互

Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现

Linux内核源码分析(B.4)深度剖析Linux伙伴系统的设计与实现文章目录1\.伙伴系统的核心数据结构2\.到底什么是伙伴3\.伙伴系统的内存分配原理4\.伙伴系统的内存回收原理5\.进入伙伴系统的前奏5.1获取内存区域zone里指定的内存水位线5.2检查zone中剩余内存容量是否满足水位线要求5.3内存分配成功之

Vision Transformer(ViT)论文解读与代码实践(Pytorch)

VisionTransformerVisionTransformer(ViT)是一种基于Transformer架构的神经网络模型,用于处理计算机视觉任务。传统的计算机视觉模型如卷积神经网络(CNN)在处理图像任务时取得了很大的成功,但CNN存在一些局限,例如对于长距离依赖的建模能力较弱。ViT通过引入Transform

Windows下SpringBoot连接Redis的正确使用姿势

1.安装Redis1.1通过wsl安装redis参考官方安装文档,需要在wsl2上安装redis服务。注意我们启动redis的方式:Firstway:采用官方文档的方式:sudoserviceredis-serverstart,关闭wsl后redis在后台仍能运行,可以sudoserviceredis-serverst

【web开发】11、文件的上传

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、文件上传二、批量上传三、案例:混合数据(form上传)四、启用media五、案例:混合数据(Modelform上传)小结提示:以下是本篇文章正文内容,下面案例可供参考一、文件上传图片文件上传:在form里添加enctype=“multipart

上海长宁来福士P2.5直径4米无边圆形屏圆饼屏圆面屏圆盘屏平面圆屏异形创意LED显示屏案例

长宁来福士广场是一个大型广场,坐落于上海中山公园商圈的核心区域,占地逾6万平方米,其中地上总建筑面积近24万平方米,总投资额约为96亿人民币。LED圆形屏是根据现场和客户要求定制的一款异形创意LED显示屏,进行文字、图片、视频等信息播放,应用在舞台、演播室、酒店、机场、路灯广告等LED场所,根据直径要求,可做成户外室内

Linux Systemd 配置开机自启

博文目录文章目录Systemd操作方式配置方式配置示例参考SystemdSystemd是一个用于启动、管理和监控Linux系统的初始化系统。它是许多现代Linux发行版中默认的初始化系统,取代了传统的SysVinit和Upstart。Systemd的引入在Linux社区引起了一些争议,因为它与传统的初始化系统有很大的差

新增动态排序图、桑基图、AntV组合图,DataEase开源数据可视化分析平台v1.18.10发布

2023年9月14日,DataEase开源数据可视化分析平台正式发布v1.18.10版本。这一版本的功能升级包括:数据集方面,对字段管理的后台保存做了相关优化,降低了资源消耗;仪表板方面,对联动、查询结果以及过滤组件等进行了调整优化,避免系统卡顿情况的发生;视图方面,新增ECharts动态排序图、AntV组合图、Ant

热文推荐