每日一练2024.5.24(补2024.5.26)

题目:

        给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

分析

        这道题目要求我们生成一个包含从1到 n²的所有元素,且元素按顺时针顺序螺旋排列的n*n正方形矩阵。我们需要注意螺旋顺序的遍历方式,具体来说,我们会扫描矩阵的上边、右边、下边和左边,每次扫描完一条边之后,边界需要进行调整,直到所有的数字都被填入矩阵为止。

示例 1 分析

输入: n = 3

输出: [[1, 2, 3], [8, 9, 4], [7, 6, 5]]

解释: 对于 n = 3,应生成一个 3x3 的矩阵,并从 1 到 9 按照顺时针的顺序依次填充矩阵。

  1. 首先,按照顺时针顺序,从左到右填充第一行:1, 2, 3。
  2. 然后,从上到下填充最右侧的列:4。
  3. 接下来,从右到左填充最后一行:5, 6。
  4. 然后,从下到上填充最左侧的列:7, 8。
  5. 最后,填充中间的元素 9。

整个过程的填充顺序如下:

1  ->  2  ->  3  |
8  <-  9  ->  4
|              |
7  <-  6  <-  5

示例 2 分析

输入: n = 1

输出: [[1]]

解释: 对于 n = 1,仅需要生成一个 1x1 的矩阵,矩阵中只有一个元素,直接填充 1 即可。

提示

范围约束:

1 ≤ n ≤ 20

这意味着输入的 n 的范围是从 1 到 20,包括 1 和 20。

  • 最小情况:

    • 当 n = 1 时,生成的矩阵为一种简单的情况,仅包含一个元素 [1]
  • 最大情况:

    • 当 n = 20 时,生成一个 20x20 的矩阵,需要填充从 1 到 400 的所有数字。这种情况下,考察代码的效率和内存使用情况尤为重要。

示例和提示总结

  • 示例 1 和 示例 2 展示了小规模的矩阵生成,帮助理解顺时针螺旋填充的逻辑。
  • 提示则定义了 n 的取值范围,让我们了解最小和最大情况下的输入范围,确保代码能在这些边界条件下正确运行。

流程图

逐字符匹配过程图示

        我们可以将矩阵看作一个右上方向开的四边形,不断收缩四条边界,依次为上、右、下、左方向进行填充。

例如 n = 3 的情况
起始:1. 1→2→32. 8   43. 7←6←5过程中1 → 2 → 3↓        ↓8        4← 7 ← 6 ← 5
完成后:1 → 2 → 3↓       48       57 ← 6 ← 5

检测并利用循环的过程图示

我们逐步填充每个方向的元素,然后调整边界值,直到所有元素都被填充:

  1. 初始状态,设定左、右、上、下四个边界 left=0right=n-1top=0bottom=n-1
  2. 依次填充上边、右边、下边、左边:
    1. 上边从 left 到 right
    2. 右边从 top 到 bottom
    3. 下边从 right 到 left
    4. 左边从 bottom 到 top
  3. 每完成一步,调整相应的边界:
    1. 填完上边后, top++
    2. 填完右边后, right--
    3. 填完下边后, bottom--
    4. 填完左边后, left++

代码优化及实现

class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int num = 1;// 定义四个边界变量int left = 0, right = n - 1, top = 0, bottom = n - 1;while (num <= n * n) {// 从左到右填充上边for (int i = left; i <= right; i++) {matrix[top][i] = num++;}top++;// 从上到下填充右边for (int i = top; i <= bottom; i++) {matrix[i][right] = num++;}right--;// 从右到左填充下边for (int i = right; i >= left; i--) {matrix[bottom][i] = num++;}bottom--;// 从下到上填充左边for (int i = bottom; i >= top; i--) {matrix[i][left] = num++;}left++;}return matrix;}public static void main(String[] args) {Solution solution = new Solution();int n = 3;int[][] matrix = solution.generateMatrix(n);for (int[] row : matrix) {for (int num : row) {System.out.print(num + " ");}System.out.println();}}
}

代码讲解

  1. 定义四个边界变量 leftrighttopbottom 分别表示当前未填充区域的左、右、上、下边界。
  2. 利用 while 循环进行填充,每次填充一个方向上的所有元素,并调整相应的边界直到所有元素填充完毕。
  3. 内部的四个 for 循环分别用于从左到右、从上到下、从右到左、从下到上的填充,并在每次填充完成后调整相应的边界(上边 top++,右边 right--,下边 bottom--,左边 left++)。
  4. 最后输出生成的矩阵。

知识点解析

  1. 二维数组的遍历和填充
    通过定义四个方向的边界和变量,我们可以灵活地控制二维数组的遍历和填充顺序。

  2. 边界收缩的条件
    每次完成一条边的填充后,我们需要调整对应的边界,这是确保螺旋顺序的关键。

  3. 循环条件控制
    通过 while 循环保证填充过程不会越界,并且能够在所有元素填满之前一直顺时针逐个填充。

通过上述代码和讲解,希望大家能够掌握如何按照指定的顺序填充一个二维数组。在实际开发中,这样的题目有助于加深对数组遍历和边界条件控制的理解。

知识点描述代码示例
二维数组定义在Java中定义并初始化一个二维数组。int[][] matrix = new int[n][n];
循环控制使用while循环进行条件控制,确保在所有元素填满之前一直循环while (num <= n * n) { ... }
边界定义定义并初始化四个边界变量,分别表示左、右、上、下的边界int left = 0, right = n - 1, top = 0, bottom = n - 1;
方向遍历使用for循环按照顺时针方向遍历四条边for (int i = left; i <= right; i++) { matrix[top][i] = num++; }
边界调整填充完一条边后,调整相应的边界值top++;right--;bottom--;left++;
数据填充在矩阵中按照顺时针顺序插入数据matrix[top][i] = num++;
方法定义定义一个生成螺旋矩阵的方法public int[][] generateMatrix(int n) { ... }
主方法main方法中调用生成矩阵的方法并打印结果public static void main(String[] args) { ... }
嵌套循环使用嵌套循环遍历并打印二维数组的值for (int[] row : matrix) { for (int num : row) { ...

 

 2024.5.26

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

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

相关文章

李良济中医馆荣获天猫健康中药行业“2023年度潜力中医馆”!

李良济集团旗下中医电商品牌李良济中医馆&#xff0c;凭借其在行业中持续提升的竞争力&#xff0c;荣获天猫健康中药行业“2023年度潜力中医馆”称号。 百年品牌&#xff0c;品质信得过 李良济成立于1914年&#xff0c;百余年来&#xff0c;恪守“良心良药&#xff0c;济世济人…

centos7和centos8安装mysql5.6 5.7 8.0

https://dev.mysql.com/downloads/repo/yum/ 注意构造下http://repo.mysql.com/mysql-community-release-el*-*.noarch.rpm 【以centos7为例】 安装mysql5.6 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5…

byzer plugin install log

离线插件参考地址&#xff1a; Byzer Documentation 离线安装方式&#xff08;错误过程记录&#xff09;&#xff1a; 参考文档&#xff1a;https://docs.byzer.org/#/byzer-lang/zh-cn/extension/README Byzer-lang 支持插件安装&#xff0c;删除&#xff0c;获取列表等。安装…

hcip—VLAN实验

目录 实验拓扑&#xff1a; 实验目的&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 1.创建VLAN 2.将接口放进相应VLAN当中&#xff0c;并配置接口类型&#xff08;hybrid口配置撕tag表&#xff09; 3.配置路由器接口 4.配置DHCP服务 pc1 ping pc4的过程分析…

linux下的docker使用

docker是什么&#xff0c;docker翻译过来的意思就是码头工人&#xff0c;顾名思义&#xff0c;docker本质上就是一个搬运工&#xff0c;只不过从搬运货物改成了搬运程序&#xff0c;使搬运的不同的程序能够独立的运行在码头上的不同容器内&#xff0c;互不干扰&#xff0c;而他…

“腾讯云 AI 代码助手”体验

一、“腾讯云 AI 代码助手”体验 1、注册账号并进行实名认证 2、进入开发环境 3、体验javascript简单函数 代码如下&#xff1a; //请写一个两个日期计算的函数 function dateDiff(date1, date2) {return date2.getTime() - date1.getTime(); } var date1 new Date("2…

智享无人直播系统(三代)融合AI智能互动,成就无人直播行业的新巨星!

随着直播行业的不断发展&#xff0c;智享直播&#xff08;三代&#xff09;作为首家自主研发的智能AI直播软件引领了行业的新潮流。相比市场上的其他同类软件&#xff0c;我们的软件通过创新的功能实现了直播间的AI智能互动&#xff0c;提供了丰富而个性化的直播体验。最重要的…

fmql入门之对标zynq差异(2)

还是有很多地方需要注意的&#xff0c;细节又繁琐。 AXI 接上一篇&#xff0c;Program bit后&#xff0c;IAR debug无现象&#xff1a; prinft没有打印出字符串&#xff1b;GPIO初始化失败。 不知道是不是vivado补丁失败的原因&#xff1a; 但是重新分析综合后还是这样。 …

Lc43---- 1221. 分割平衡字符串(java版)---(贪心)(字符串)

1.题目描述 2.知识点和思路 &#xff08;1&#xff09;贪心算法的基本思想 选择性质&#xff1a;在每一步中&#xff0c;选择当前最优的选项&#xff0c;不考虑未来的后果。 局部最优解&#xff1a;通过一系列局部最优选择&#xff0c;构建全局最优解。 不可回溯&#xff1a;一…

2024电工杯A题详细思路代码分析数学建模:园区微电网风光储协调优化配置

题目分析&#xff1a;园区微电网风光储协调优化配置 我们会先给出三个问题总体的分析&#xff0c;最后会详细分析问题一的建模和详细内容。 背景&#xff1a; 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;为了尽量提高风光电量的负荷占比&#xff0c;需配置较高比…

02--大数据Hadoop集群实战

前言&#xff1a; 前面整理了hadoop概念内容&#xff0c;写了一些概念和本地部署和伪分布式两种&#xff0c;比较偏向概念或实验&#xff0c;今天来整理一下在项目中实际使用的一些知识点。 1、基础概念 1.1、完全分布式 Hadoop是一个开源的分布式存储和计算框架&#xff0…

C++对C的扩充

C既可用于面向过程的程序设计&#xff0c;也可用于面向对象的程序设计。在面向过程程序设计的领域&#xff0c;C继承了C语言提供的绝大部分功能和语法规定&#xff0c;并在此基础上做了不少扩充&#xff0c;主要有一下几个方面&#xff1a; 1.C的输入输出 C为了方便用户&…

Spring 事务源码分析

前言&#xff1a; 我们知道 Spring 声明式事务是通过 AOP 来实现的&#xff0c;日常项目开发中我们只需要使用 Transactional 注解就可以实现声明式事务&#xff0c;那你知道通过 Transactional 注解怎样实现事务的吗&#xff1f;本篇我们将从源码来分析 Spring 声明式事务的执…

STM32定时器四大功能之定时器编码接口

1什么是编码器接口&#xff1f; 编码器接口接受编码器的正交信号&#xff0c;根据编码器产生的正交信号脉冲控制CNT的自增和自减&#xff0c;从而指示编码器的旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口&#xff0c;同时正交编码器产生的正交信号分…

Redis 的持久化(真的好细)

前言 Redis 是一个内存数据库&#xff0c;把数据存储在内存中&#xff0c;而内存中的数据是不持久的&#xff0c;要想数据持久就得将数据存储到硬盘中&#xff0c;而 Redis 相比于 Mysql 这样的关系型数据库最大的优势就在于将数据存储在内存中从而效率更高&#xff0c;速度更快…

docker 安装RabbitMQ-web版本

直接拉去web版本 docker pull rabbitmq:management启动命令 设置用户名 admin 密码123456 docker run -dit --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASS123456 rabbitmq:management访问地址 http://127.0.0.1:…

GeoScene产品学习视频收集

1、易智瑞运营的极思课堂https://www.geosceneonline.cn/learn/library 2、历年易智瑞技术公开课视频资料 链接&#xff1a;技术公开课-易智瑞信息技术有限公司&#xff0c;GIS/地理信息系统&#xff0c;空间分析-制图-位置智能-地图 3、一些关于GeoScene系列产品和技术操作的视…

二进制部署k8s集群 部署高可用master节点

目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建 etcd &…

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

漏洞复现环境搭建请参考 http://t.csdnimg.cn/MxmId 漏洞版本 Apache Log4j 2.8.2之前的2.x版本 漏洞验证 &#xff08;1&#xff09;开放端口4712 漏洞利用 &#xff08;1&#xff09;ysoserial工具获取 wget https://github.com/frohoff/ysoserial/releases/download/v0…

Flink DataStream API 基础算子(一)

一、介绍 官网 DataStream API 得名于特殊的 DataStream 类&#xff0c;该类用于表示 Flink 程序中的数据集合。你可以认为 它们是可以包含重复项的不可变数据集合。这些数据可以是有界&#xff08;有限&#xff09;的&#xff0c;也可以是无界&#xff08;无限&#xff09;的…