每日一练2024.5.24(补2024.5.26)

news2024/9/17 7:18:23

题目:

        给你一个正整数 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→3
 2. 8   4
 3. 7←6←5

过程中
  1 → 2 → 3
  ↓        ↓
  8        4
  ← 7 ← 6 ← 5
完成后:

  1 → 2 → 3
  ↓       4
  8       5
  7 ← 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.coloradmin.cn/o/1689484.html

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

相关文章

亚马逊自养号测评:深入解析与搭建要求

在亚马逊这电商平台上&#xff0c;商品的评价对于卖家来说至关重要。为了提升商品的曝光率、排名、权重和销量&#xff0c;卖家们纷纷采用各种推广方式&#xff0c;其中&#xff0c;亚马逊自养号测评成为了越来越多卖家选择的一种有效方式。 亚马逊自养号测评&#xff0c;顾名…

《SpringBoot》系列文章目录

SpringBoot是由Pivotal团队提供的全新框架&#xff0c;旨在简化新Spring应用的初始搭建以及开发过程。以下是一些关于SpringBoot的详细介绍&#xff1a; 设计目的&#xff1a;SpringBoot通过特定的方式来进行配置&#xff0c;使得开发人员不再需要定义样板化的配置&#xff0c…

服务器端口开放,服务器端口开放命令与方法的专业阐述

在计算机网络中&#xff0c;服务器端口的开放是确保网络通信畅通无阻的关键步骤。服务器端口是服务器与外部网络通信的入口&#xff0c;通过正确配置和开放相应的端口&#xff0c;可以实现各种网络服务和应用的功能。 一、命令与工具 在Linux系统中&#xff0c;常用的命令和工…

AI生成内容检测|Fast-DetectGPT:通过条件概率曲率对机器生成文本进行有效的零样本检测

【摘要】大型语言模型 (LLM) 已显示出生成流畅且有说服力的内容的能力&#xff0c;这既带来了生产力机会&#xff0c;也带来了社会风险。要构建值得信赖的 AI 系统&#xff0c;必须区分机器生成的内容和人类创作的内容。领先的零样本检测器 DetectGPT 展示了值得称赞的性能&…

Linux批量设置免密登录shell脚本

一&#xff1a;话不多说&#xff0c;直接上脚本 #!/bin/bash# 用户名和密码配置 USERNAME"root" PASSWORD"123456" NEW_ROOT_PASSWORDroot123# 转义新的 root 密码以安全地传递给远程 shell ESCAPED_PASSWORD$(printf %q "$NEW_ROOT_PASSWORD")…

200smart【编程入门】

说明 编程时&#xff0c;遇到困难就按【F1】 【I】输入 200smart 上限 i0.0~i31.7 255bit【255个输入点】 i0.0~i31.7 八进制 【布尔 bool 】 ib0~ib127 【单字节】 8bit iw0~iw127 …

Thingsboard规则链:Alarm Status Filter节点详解

在物联网(IoT)平台的世界里&#xff0c;数据处理与自动化响应是核心功能之一。作为其中的佼佼者&#xff0c;Thingsboard提供了一套强大的规则引擎系统&#xff0c;允许用户基于设备上报的数据构建复杂的自动化逻辑。在这套规则引擎中&#xff0c;Alarm Status Filter节点扮演了…

C++中获取int最大与最小值(补)

上文中&#xff0c;我们学习了C中获取int最大与最小值的两种方法&#xff1a;C库和移位运算&#xff0c;这篇文章将解决在移位运算中遇到的各种报错&#xff0c;并提出一种新的生成int最值的方法 上文链接&#xff1a;http://t.csdnimg.cn/cn7Ad 移位运算取最值常见报错 Dev…

完全背包之零钱兑换I

上次分享完完全背包问题的解决思路后&#xff0c;这次分享一道和完全背包有关的leetcode题。 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果…

守护者:ThingsBoard物联网网关在温室环境监测中的应用

系统设计 智慧农业温室大棚系统由传感器及执行设备、数据传输网关、智慧农业温室大棚管理平台组成。 系统支持实时采集温室大棚内的空气温湿度、土壤温湿度、光照和二氧化碳等环境参数&#xff0c;根据农作物的生长需求自动控制温室中电器设备的启停&#xff0c;从而达到植物生…

【MySQL精通之路】InnoDB(5)-内存结构

总目录&#xff1a; 【MySQL精通之路】InnoDB存储引擎-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】InnoDB(4)-架构图-CSDN博客 目录 ​编辑 1 缓存池&#xff08;Buffer Pool&#xff09; 1.1 缓存池LRU算法 1.2 缓存区配置 1.3 使用InnoDB标准监视器监视缓存池 …

C语言章节学习归纳--数据类型、运算符与表达式

3.1 C语言的数据类型&#xff08;理解&#xff09; 首先&#xff0c;对变量的定义可以包括三个方面&#xff1a; 数据类型 存储类型 作用域 所谓数据类型是按被定义变量的性质&#xff0c;表示形式&#xff0c;占据存储空间的多少&#xff0c;构造特点来划分的。在C语言中&…

必刷!!软考程序员100道高频题(含知识点解析),轻松45+

软考已经迫在眉睫&#xff0c;趁着最后的时间赶紧冲刺起来。 今天给大家整理了——软考程序员经典100道高频题&#xff08;含解析&#xff09;&#xff0c;涵盖大部分知识点&#xff0c;有PDF版&#xff0c;可打印出来考一考&#xff0c;说不定考试时候就能遇到很多熟悉的“老朋…

5.23.9 TransUNet:Transformers 为医学图像分割提供强大的编码器

TransUNet&#xff0c;它兼具 Transformers 和 U-Net 的优点&#xff0c;作为医学图像分割的强大替代方案。一方面&#xff0c;Transformer 对来自卷积神经网络 (CNN) 特征图的标记化图像块进行编码&#xff0c;作为用于提取全局上下文的输入序列。另一方面&#xff0c;解码器对…

git分支常用命令

最近在用git提交代码的时候&#xff0c;发现有些命令不是很会&#xff0c;先记录几个常用分支命令&#xff0c;后续再补充&#xff0c;在执行git push命令提交代码的时候遇到报错&#xff0c;一并记录下。 1.git常用命令 新建分支&#xff1a; git branch <分支名称> 比…

Internet动态路由选择—RIP与OSPF

刚做完网络层动态路由选择的实验&#xff0c;写下此篇记录实验过程&#xff0c;巩固学习成果。 参考书目&#xff1a;《计算机网络》北京理工大学出版社-刘阳老师编 路由选择可分为两种策略&#xff1a; - 静态路由选择策略 - 动态路由选择策略 静态路由即管理员手动配置路由…

Python3 笔记:IDLE的几个基本设置

1、设置字体&#xff1a; Options > Configure IDLE > Fonts 2、设置文字颜色&#xff08;设置高亮&#xff09;&#xff1a; Options > Configure IDLE > Highlights 3、设置背景颜色&#xff1a; Options > Configure IDLE > Highlights 4、设置窗口&a…

Centos7环境下MySQL5.7.38 安装开源审计插件 mysql-audit

MySQL安装开源审计插件 mysql-audit MySQL 5.7.38安装审计插件 mysql-audit安装MySQL1.查看Linux服务器版本和glibc版本2.根据自己的系统下载对应的MySQL版本&#xff0c;由于mysql-audit并不支持所有版本的MySQL&#xff0c;所以在确定MySQL版本之前请注意下插件支持的MySQL版…

hcip—VLAN实验

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

在Spring Boot项目中通过自定义注解实现多数据源以及主备数据库切换

在现代的企业应用开发中&#xff0c;使用多数据源是一个常见的需求。尤其在关键应用中&#xff0c;设置主备数据库可以提高系统的可靠性和可用性。在这篇博客中&#xff0c;我将展示如何在Spring Boot项目中通过自定义注解实现多数据源以及主备数据库切换。 在此说明&#xff…