算法的学习笔记—顺时针打印矩阵(牛客JZ29)

news2024/12/26 13:08:38

img

😀前言
在算法的学习过程中,二维数组的操作是一个非常重要的内容,其中顺时针打印矩阵是一个经典的问题。这个问题不仅考察我们对矩阵的理解,还要求我们具备较强的逻辑思维能力。本文将详细解析如何通过Java代码来实现这一功能。

🏠个人主页:尘觉主页

文章目录

  • 😀顺时针打印矩阵
    • ❤️‍🔥题目链接
      • 🤔题目描述
      • 😊数据范围:
    • 🫡示例1
    • 🫡 示例2
      • 🥰解题思路
      • 💕代码实现
      • 😊代码解析
    • 😄总结

😀顺时针打印矩阵

❤️‍🔥题目链接

牛客网

🤔题目描述

给定一个二维矩阵,要求按照顺时针的顺序,从外到里依次打印出矩阵中的所有元素。例如,假设我们有如下的4x4矩阵:

image-20201104010349296

顺时针打印的结果应该是:[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

输入:[[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]

🫡 示例2

输入:[[1,2,3,1],[4,5,6,1],[4,5,6,1]]

返回值:[1,2,3,1,1,1,6,5,4,4,5,6]

🥰解题思路

要实现顺时针打印矩阵,我们可以将其看作是逐层打印。具体来说,从矩阵的外层开始,按照顺时针的顺序依次打印出来,然后逐层向内推进,直到矩阵的所有元素都被打印出来。

为了实现这一思路,我们需要使用四个变量来分别标记当前未打印区域的上下左右边界,即 r1, r2, c1, c2。这些变量分别代表当前矩阵部分的上边界、下边界、左边界和右边界。

打印一层矩阵的步骤如下:

  1. 从左到右打印当前层的上边界。
  2. 从上到下打印当前层的右边界。
  3. 如果上边界和下边界不同,从右到左打印当前层的下边界。
  4. 如果左边界和右边界不同,从下到上打印当前层的左边界。

每打印完一层矩阵后,更新边界值,逐步缩小打印范围,直到所有元素都被打印为止。

💕代码实现

我们可以用Java语言来实现这一逻辑,代码如下:

image-20240819170559641

public ArrayList<Integer> printMatrix(int[][] matrix) {
    ArrayList<Integer> ret = new ArrayList<>();
    int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1;
    
    while (r1 <= r2 && c1 <= c2) {
        // 从左到右打印上边界
        for (int i = c1; i <= c2; i++)
            ret.add(matrix[r1][i]);
        // 从上到下打印右边界
        for (int i = r1 + 1; i <= r2; i++)
            ret.add(matrix[i][c2]);
        // 从右到左打印下边界
        if (r1 != r2)
            for (int i = c2 - 1; i >= c1; i--)
                ret.add(matrix[r2][i]);
        // 从下到上打印左边界
        if (c1 != c2)
            for (int i = r2 - 1; i > r1; i--)
                ret.add(matrix[i][c1]);
        
        // 更新边界,向内收缩一层
        r1++; r2--; c1++; c2--;
    }
    
    return ret;
}

😊代码解析

  • r1, r2, c1, c2 分别表示当前未打印部分的上下左右边界。
  • while 循环保证只要还有未打印的部分,就继续执行打印操作。
  • 每次打印完一层后,通过调整 r1, r2, c1, c2 的值来缩小打印范围,逐步向内推进。
  • 需要特别注意的是,当只有一行或一列时,不需要重复打印下边界或左边界,因此要加上条件判断。

😄总结

通过这种逐层打印的方式,我们能够轻松地实现顺时针打印矩阵的功能。这一方法充分利用了矩阵的结构特点,避免了重复打印和漏打的情况,代码逻辑清晰,易于理解。希望这篇文章能够帮助你更好地掌握顺时针打印矩阵的问题及其解法,为你的算法学习之路增添一分助力。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

SpringBoot响应式编程(3)R2DBC

一、概述 1.1简介 R2DBC基于Reactive Streams反应流规范&#xff0c;它是一个开放的规范&#xff0c;为驱动程序供应商和使用方提供接口&#xff08;r2dbc-spi&#xff09;&#xff0c;与JDBC的阻塞特性不同&#xff0c;它提供了完全反应式的非阻塞API与关系型数据库交互。 …

c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承

目录 前言&#xff1a; 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱…

AIoT智能物联网平台定义

随着科技的飞速发展&#xff0c;我们正步入一个由智能设备和互联网络构成的新时代。AIoT&#xff0c;即人工智能物联网&#xff08;Artificial Intelligence of Things&#xff09;&#xff0c;是这个时代的标志性产物。本文旨在探讨AIoT智能物联网平台的定义、核心组件、应用场…

wordpress站群搭建6外部库的引入和测试

wordpress站群搭建6wordpress外部库的引入和测试 本次目标我们主要讲解引入wordpress外部库并测试。 我们将一些外部库和工具包放入到pkg项目&#xff0c;方便其他项目引用。 1.安装go-wordpress库 进入到pkg项目 go get github.com/robbiet480/go-wordpress2.编写工具类 …

22 交换机双工模式

交换机双工模式 一、双工模式 &#xff08;一&#xff09;单工、半双工、全双 ​ 单工&#xff1a; ​ 只有一个信道&#xff0c;传输方向只能是单向的 ​ 半双工&#xff1a; ​ 只有一个信道&#xff0c;在同一时刻&#xff0c;只能是单向传输 ​ 全双工&#xff1a; …

【JavaEE】深入MyBatis:动态SQL操作与实战项目实现指南

目录 MyBatis的进阶操作动态SQL<if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 练习表白墙数据准备引⼊MyBatis 和 MySQL驱动依赖配置MySQL账号密码编写后端代码测试 图书管理系统数据库表设计引⼊MyBatis 和MySQL 驱…

阿里QuickBI实战

目录 引言数据采集、数据治理、数据分析举例资金在经济社会的流通性 概述数据分析的常见问题数据分析的痛点 QuickBI 产品架构图主功能链路数据建模与数据分析的关系使用场景1、搭建报表看板&#xff1a;仪表盘2、中国式报表工具&#xff1a;电子表格3、企业CXO驾驶舱&#xff…

网络工程3(子网通信,为什么要使用mac和ip)

文章目录 一. 子网如何通讯1. 子网内部通信2. 子网外部通信 二. 交换机和路由器的连接三. 为什么不只使用mac地址或ip地址进行网络通信1. 首先要明确的是&#xff0c;不管是只用mac或只用ip通信 四. 子网设备如何获得ip五. 不同网段的主机无法直接通信的原因 一. 子网如何通讯 …

GAMES101——作业7 路径追踪 (含提高:多线程,微平面理论)

任务 castRay(const Ray ray, int depth)in Scene.cpp: 在其中实现 Path Tracing 算法 可能用到的函数有&#xff1a; intersect(const Ray ray)in Scene.cpp: 求一条光线与场景的交点 sampleLight(Intersection pos, float pdf) in Scene.cpp: 在场景的所有光源上按面积…

用 CWE API 减轻软件产品中的安全风险

1. CWE REST API 推出的目的 8 月 8 号&#xff0c;CWE™ 计划推出了“CWE REST API”。 CWE™计划由美国网络安全与基础设施安全局(Cybersecurity & Infrastructure Security Agency(CISA))资助的国土安全系统工程与发展研究所(Homeland Security Systems Engineering a…

AutoSAR SecOC小小科普

目录 1.为什么要提SecOC 2.SecOC基本原理 2.1 参与到MAC计算的数据有哪些 2.2 新鲜度值如何管理 3.SecOC与各模块关联关系 1.为什么要提SecOC 在车载网络技术里&#xff0c;大家基本都是从CAN开始入门。在CAN DBC里&#xff0c;我们总能看到有些报文除了自带有效payload外…

AWS 消息队列服务 SQS

AWS 消息队列服务 SQS 引言什么是 SQSSQS 访问策略 Access Policy示例&#xff1a;如何为 DataLake Subscription 配置 SQS 引言 应用系统需要处理海量数据&#xff0c;数据发送方和数据消费方是通过什么方式来无缝集成消费数据的&#xff0c;AWS 提供 SQS 消息队列服务来解决…

42000 Star图标工具Mermaid!

Mermaid&#xff1a;用文本构建图表世界 - 精选真开源&#xff0c;释放新价值。 概览 Mermaid.js 是一个创新的开源工具&#xff0c;专为简化图表创建流程而设计。它通过一种简洁的文本描述语言&#xff0c;使得用户能够快速地生成流程图、序列图、甘特图等图表&#xff0c;而…

【威锋网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

JavaEE过滤器的创建与使用过滤器的使用场景

过滤器 Filter也称之为过滤器&#xff0c;过滤器是javaEE规范肿定义的一种技术,可以让请求到达目标servlet之前,先进入到过滤器中,在过滤器中统一进行一些拦截处理,当处理完成后,可以继续向后执行,到达目标servlet,如果配置了多个过滤器,也可以进入下一个过滤器 创建过滤器 创…

一键更换Linux优质的软件源和docker源 —— 筑梦之路

一个非常牛逼的开源项目&#xff1a;https://github.com/SuperManito/LinuxMirrors.git LinuxMirrors 使换源更简单 - LinuxMirrors 支持的操作系统 系统名称适配版本Debian8.0 ~ 13Ubuntu14.04 ~ 24Kali Linux2.0 ~ 2024Linux Mint19.0 ~ 21 / LMDE 6DeepinallArmbianallP…

Redis7基础篇(一)

redis十大数据类型 目录 redis十大数据类型 redis键key 数据类型命令 redis字符串string 分布式锁 ​编辑 ​编辑​编辑应用场景 ​编辑​编辑 reids列表list 应用场景 redis哈希hash 应用场景 redis集合set 应用场景 redis有序集合zset&#xff08;sorted set集…

【设计模式】观察者模式和订阅发布模式

观察者模式 观察者模式包含观察目标和观察者两类对象。一个目标可以有任意数目的与之相依赖的观察者。一旦观察目标的状态发生改变&#xff0c;所有的观察者都将得到通知。 当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新&#xff0c;解决…

《机器学习》逻辑回归 梯度下降、混淆矩阵、随机种子、正则化惩罚 No.6

一、混淆矩阵 1、什么是混淆矩阵&#xff1f; 混淆矩阵是用于评估分类模型在不同类别上的预测准确性的工具。它提供了模型预测结果与真实结果之间的对应关系&#xff0c;帮助我们分析和理解模型的分类性能。 假设&#xff0c;要对15个人预测是否患病&#xff0c;使用1表示患病…

生产环境中MapReduce的最佳实践

目录 MapReduce跑的慢的原因 MapReduce常用调优参数 1. MapTask相关参数 2. ReduceTask相关参数 3. 总体调优参数 4. 其他重要参数 调优策略 MapReduce数据倾斜问题 1. 数据预处理 2. 自定义Partitioner 3. 调整Reduce任务数 4. 小文件问题处理 5. 二次排序 6. 使用…