每日一练(17):顺时针打印矩阵

简介: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。


示例 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]


限制:


0 <= matrix.length <= 100

0 <= matrix[i].length <= 100


来源:力扣(LeetCode)


链接:https://leetcode-cn.com/probl...


方法:设定边界


根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]] 的对应输出 [1,2,3,6,9,8,7,4,5] 可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。


因此,考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。


算法流程:


1.空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。

2.初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。

3.循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向


打印中做以下三件事 (各方向的具体信息见下表) ;


  • 1.根据边界打印,即将元素按顺序添加至列表 res 尾部;
  • 2.边界向内收缩 11 (代表已被打印);
  • 3.判断是否打印完毕(边界是否相遇),若打印完毕则跳出。
  • 4.返回值: 返回 res 即可。


打印方向 1. 根据边界打印 2. 边界向内收缩 3. 是否打印完毕
从左向右 左边界 l ,右边界 r 上边界 t 加 1 是否 t > b
从上向下 上边界 t ,下边界 b 右边界 r 减 1 是否 l > r
从右向左 右边界 r ,左边界 l 下边界 b 减 1 是否 t > b
从下向上 下边界 b ,上边界 t 左边界 l 加 1 是否 l > r


复杂度分析:


  • 时间复杂度 O(MN) : M,N 分别为矩阵行数和列数。
  • 空间复杂度 O(1) : 四个边界 l , r , t , b 使用常数大小的 额外 空间( res 为必须使用的空间)。


vector<int> spiralOrder(vector<vector<int>>& matrix) {
    if (matrix.empty()) {
        return {};
    }
    vector<int> res;
    int l = 0;                      //左边界
    int r = matrix[0].size() - 1;   //右边界
    int t = 0;                      //上边界
    int b = matrix.size() - 1;      //下边界
    while (true) {
        //left -> right
        for (int i = l; i <= r; i++) {
            res.push_back(matrix[t][i]);
        }
        if (++t > b) {
            break;
        }
        //top -> bottom
        for (int i = t; i <= b; i++) {
            res.push_back(matrix[i][r]);
        }
        if (--r < l) {
            break;
        }
        //right -> left
        for (int i = r; i >= l; i--) {
            res.push_back(matrix[b][i]);
        }
        if (--b < t) {
            break;
        }
        //bottom -> top
        for (int i = b; i >= t; i--) {
            res.push_back(matrix[i][l]);
        }
        if (++l > r) {
            break;
        }
    }
    return res;
}


目录
相关文章
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
526 11
|
监控 安全 数据可视化
java基于微服务的智慧工地管理云平台SaaS源码 数据大屏端 APP移动端
围绕施工现场人、机、料、法、环、各个环节,“智慧工地”将传统建筑施工与大数据物联网无缝结合集成多个智慧应用子系统,施工数据云端整合分析,提供专业、先进、安全的智慧工地解决方案。
414 1
|
算法 搜索推荐 安全
淘宝信息流融合混排服务升级
淘宝信息流融合混排服务升级
1231 1
|
6月前
|
人工智能 安全 人机交互
溯源技术革命:新型数字水印如何让数据“开口说话”,指认泄密源头?
当敏感信息遭偷拍、打印外泄或录音外传,隐形数字水印如“数据守护者”悄然溯源,精准锁定泄密源头。跨屏幕、纸质、音视频等多介质,实现“电-光-电”“电-纸-电”“电-空-电”全链路追踪。从军工到金融,从会议到协作,水印技术正构筑数据安全“最后一公里”防线。AIGC时代,更将融合AI与区块链,守护数字真实性。
|
自然语言处理 API C++
阿里通义推出SmartVscode插件,自然语言控制VS Code,轻松开发应用,核心技术开源!
SmartVscode插件深度解析:自然语言控制VS Code的革命性工具及其开源框架App-Controller
2276 1
阿里通义推出SmartVscode插件,自然语言控制VS Code,轻松开发应用,核心技术开源!
|
5月前
|
机器学习/深度学习 人工智能 供应链
从“识图”到“购得”:图片搜索商品如何重构消费与供应链逻辑?
图片搜索正重塑电商:从“看到”到“买到”,只需一张图。它以AI解析视觉特征,精准匹配商品,打通C端购物与B端供应链,让找货、比价、溯源高效直达,成为连接视觉信息与交易的核心纽带。
|
前端开发 安全 JavaScript
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
704 0
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
数字化转型需要的技术:生成式AI时代的全栈能力图谱
本文探讨生成式AI推动下的数字化转型技术需求转变,从技术本质、实施路径、伦理规制三方面解构核心要素。技术本质从工具理性进化到能力体系,需建立模型思维、多模态交互和自主进化能力。实施路径分为认知重构、实验验证与迭代优化三个阶段。同时,文章介绍生成式人工智能认证(GAI认证)的战略价值,强调其在能力基准建立、技术合作及创新生态接入中的作用。最后,文章分析组织能力进化与未来技术前沿,如认知智能、具身智能和群体智能的演进方向,为企业提供全面的技术赋能与战略转型指导。
|
Java 测试技术 开发者
🌟Java 零基础 | 深入理解三目运算符
【10月更文挑战第13天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
1367 3