剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)

news2025/1/20 5:59:32

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:

[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]

则依次打印出数字

[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

数据范围:

0 <= matrix.length <= 100

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

示例:

输入:

[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]

返回值:

[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

解题思路:

本题考察算法场景模拟。两种解题思路。

1)模拟边界

       将矩阵看成多层包裹,先顺时针遍历最外面一层,再进入里面一层继续遍历,直到上下左右边界交错。

2)螺旋矩阵

       环带为一层遍历,边界为一层遍历。边界遍历又分为上下左右四个子部分。以“1+4”的组合遍历,完成螺旋矩阵。

测试代码:

1)模拟边界

class Solution {
public:
    vector<int> printMatrix(vector<vector<int>> matrix) {
        vector<int> result;
        int size = int(matrix.size());
        // 处理矩阵为空的情况
        if(size == 0) 
            return result;
        // 左边界
        int left = 0; 
        // 右边界
        int right = matrix[0].size() - 1; 
        // 上边界
        int up = 0; 
        // 下边界
        int down = size - 1; 
        // 循环直到边界交错
        while(left <= right && up <= down){ 
            // 上边界从左到右
            for(int i = left; i <= right; i++) 
                result.push_back(matrix[up][i]); 
            // 上边界向下一格,并判断上下边界位置是否交错
            up++; 
            if(up > down)
                break;
            // 右边界从上到下
            for(int i = up; i <= down; i++) 
                result.push_back(matrix[i][right]);
            // 右边界向左一格,并判断左右边界位置是否交错
            right--; 
            if(left > right)
                break;
            // 下边界从右到左
            for(int i = right; i >= left; i--) 
                result.push_back(matrix[down][i]);
            // 下边界向上一格,并判断上下边界位置是否交错
            down--; 
            if(up > down)
                break; 
            // 左边界从下到上
            for(int i = down; i >= up; i--) 
                result.push_back(matrix[i][left]);
            // 左边界向右一格,并判断左右边界位置是否交错
            left++; 
            if(left > right)
                break;
        }
        return result;
    }
};

2)螺旋矩阵

class Solution {
public:
    vector<int> printMatrix(vector<vector<int>> matrix) {       
        int row = int(matrix.size());
        int col = int(matrix[0].size());
        // 处理矩阵为空的情况
        if(row == 0 || col == 0) 
            return vector<int>(0);
        // 确认环数,环数与行列的最小值有关
        int minL = min(row, col);
        int ring = minL / 2 + minL % 2;
        // 螺旋矩阵遍历
        int count = row * col;
        int t = 0;
        vector<int> result(count);
        for(int k = 0; k < ring; ++k){
            // 当前环上边界遍历
            for(int p = k; p < col - k && t < count; ++p){
                result[t++] = matrix[k][p];
            }
            // 当前环右边界遍历
             for(int p = k + 1; p < row - k - 1 && t < count; ++p){
                result[t++] = matrix[p][col - k - 1];
            }
            // 当前环下边界遍历
             for(int p = col - k - 1; p >= k && t < count; --p){
                result[t++] = matrix[row - k - 1][p];
            }
            // 当前环左边界遍历
             for(int p = row - k - 2; p >= k + 1 && t < count; --p){
                result[t++] = matrix[p][k];
            }
        }
        return result;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/943469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDK配置环境变量(超详细)

1.打开高级系统设置 电脑右键--属性&#xff0c;或者搜索“高级系统设置” 找到高级系统设置 2.环境变量 高级--环境变量 3.配置JAVA_HOME JAVA_HOME 4.添加到Path中 %JAVA_HOME%\bin 5.测试是否配置成功 快捷键winR,输入cmd&#xff0c;回车 打开黑屏命令窗口。 如果配…

windows11显示未激活怎么办

遇到的问题 本人遇到的问题&#xff0c;win11家庭中文版 reset后&#xff0c;系统正常使用&#xff0c;但是系统状态是未激活&#xff0c;未激活就意味着某些功能不可用&#xff0c;比如我就是想改一下系统主题&#xff0c;就是不能改&#xff0c;因为系统没有激活&#xff0c…

开学季触控笔买哪种好?ipad可以用的性价比手写笔

虽然苹果的平板电脑价格不菲&#xff0c;但如果你有足够的资金&#xff0c;还是可以考虑购买一台。而且&#xff0c;这款iPad配上了一支电容笔&#xff0c;不仅可以用来绘画&#xff0c;还可以用来做笔记。苹果的原装电容笔&#xff0c;虽然功能很强&#xff0c;但价格很贵&…

当摩托不再“摩登”,谁又在风口狂飙?

【潮汐商业评论/文】 “你看&#xff0c;这女生骑摩托车真是泰酷辣。” Jessica举着手机里一个女生骑摩托的视频对闺蜜说。 对于很多人来说&#xff0c;摩托车都是一个极具独特魅力的出行工具。硬朗的机车、酷帅的骑行服&#xff0c;配上发动机的轰鸣声&#xff0c;似乎看到…

上海港股通开通条件是什么?港股通交易佣金最低多少?

上海港股通权限开通条件有&#xff1a; 1、申请权限开通前20个交易日证券账户日均资产不低于50万元; 2、进行港股知识测试&#xff0c;且测试分数不低于80分; 3、风险承受能力等级需要匹配&#xff0c;无投资经验期限的门槛 港股通的股票范围是香港联合交易所恒生综合大型股…

[ES]二基础 |

一、索引库操作 1、mapping属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; 1)type&#xff1a;字段数据类型&#xff0c;常见的简单类型有&#xff1a; ①字符串&#xff1a;text(可分词的文本)、keyword&#xff08;精确值&#xff0c…

直播预约丨《实时湖仓实践五讲》第一讲:企业为什么需要实时湖仓?

如今&#xff0c;大规模、高时效、智能化数据处理已是“刚需”&#xff0c;企业需要更强大的数据平台&#xff0c;来应对数据查询、数据处理、数据挖掘、数据展示以及多种计算模型并行的挑战&#xff0c;湖仓一体方案应运而生。 《实时湖仓实践五讲》是袋鼠云打造的系列直播活…

详解转置卷积 代码实现

转置卷积 计算输出的形状公式 输出矩阵的高 (输入的高-1) x 高方向的步长 - 2 x 高方向的填充 卷积核的高 输出矩阵的宽 (输入的宽-1) x 宽方向的步长 - 2 x 宽方向的填充 卷积核的宽举例计算&#xff1a;当输入为2x2&#xff0c;转置卷积核形状为2x2的情况 代入公式验证…

传统企业如何进行数字化转型升级?

传统企业通过一系列战略和运营变革进行数字化转型升级&#xff0c;利用技术增强业务流程、改善客户体验&#xff0c;在数字化时代保持竞争力。以下是他们通常如何处理此过程的分步概述&#xff1a; 1.评估和战略制定&#xff1a; 了解当前状态&#xff1a;评估现有业务流程、…

【Cesium创造属于你的地球】实现地球展示、灵活进行坐标转换、视角切换

大家好&#xff0c;我是AIC山鱼&#xff01;&#x1f449;这是我的主页 &#x1f40b;作为CSDN博主和前端优质创作者✍&#xff0c;我致力于为大家带来新颖、脱俗且有趣的内容。 &#x1f431;我还创建了山鱼社区&#xff0c;这是一个独特的社区&#x1f3e0;&#xff0c;&…

windows服务器查看网络带宽

windows服务器查看网络带宽&#xff1f; 鼠标右键单击win标志&#xff0c;进入计算机管理 另外一个方法&#xff1a;

前端须知名词解释

目录 一、多维转一维 二、一维转多维 一维转多维——使用场景&#xff1a;分页 三、判断当前元素是否为数组 四、判断当前元素是否是空对象 五、数字分割符&#xff1a;提高数字可读性 六、模糊盒子&#xff08;怪异盒子&#xff09;与标准盒模型 七、css的filter属性 …

代码随想录算法训练营day42 | 01背包问题,416. 分割等和子集

目录 01背包问题 416. 分割等和子集 01背包问题 416. 分割等和子集 类型&#xff1a;动态规划&#xff0c;01背包 难度&#xff1a;medium 思路: 经典的01背包问题&#xff0c;背包容量为sum/2, 每个物品的重量为nums[i],其价值也为nums[i]。 需要注意的是&#xff0c;如果…

数字世界的不朽之旅,探索人类意识的未来归宿!

在莎士比亚名剧《哈姆雷特》中&#xff0c;有一句经典的独白“生存还是死亡&#xff0c;这是一个值得考虑的问题”&#xff0c;令人沉思。数百年后的今天&#xff0c;随着人工智能技术的不断发展&#xff0c;数字永生正在改变着生死的边界&#xff0c;使得“有的人死了&#xf…

Ctenos7安装mysql-8.1.0/tomcat-9.0.80/LNMT部署

目录 一、实验拓扑 二、部署mysql 三、部署Tomcat 四、配置NGINX 五、 配置NGINX的双机热备提高可用性 一、实验拓扑 二、部署mysql 官网下载地址https://dev.mysql.com/downloads/mysql/ 1、移除mariadb&#xff0c;安装所需应用 mysql-8.1.0 社区版 安装说明官网下载地址…

【高等数学基础知识篇】——函数,极限与连续

本文仅用于个人学习记录&#xff0c;使用的教材为汤家凤老师的《高等数学辅导讲义》。本文无任何盈利或者赚取个人声望的目的&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 文章目录 一、函数基础知识1.1 基本初等函数和初等函数1.2 函数的初等特性1.3 特殊函数 二、…

网络综合布线专业技能人才培养方案

一、网络综合布线专业技能人才培养方案概述 网络综合布线专业技能人才培养方案旨在培养具备综合布线系统设计、安装与维护的全面技能和知识的专业人才。以下是一个概述&#xff1a; 培养目标&#xff1a;培养具备综合布线系统的理论基础和实践操作技能的专业人才&#xff0c;能…

参考平面很重要,为啥这里要挖掉?

高速先生成员--姜杰 传输线结构包括信号路径和返回路径&#xff0c;以平面形式出现的返回路径通常被称为参考平面。不少刚接触高速信号设计的朋友会有这样的困惑&#xff1a;都说走线的参考平面很重要&#xff0c;为啥有些信号还要把途经SMD元器件管脚下方的参考平面挖掉&#…

华为OD机试 - 玩牌高手 - 动态规划(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、解题思路具体规则如下&#xff1a;具体步骤如下&#xff1a; 五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 给定一个长度为n的整型数组&#xff0…

【Golang】go条件编译

交叉编译只是为了能在一个平台上编译出其他平台可运行的程序&#xff0c;Go 作为一个跨平台的语言&#xff0c;它提供的类库势必也是跨平台的&#xff0c;比如说程序的系统调用相关的功能&#xff0c;能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译…