AI学习第七天

数组:基础概念、存储特性及力扣实战应用

在计算机科学与数学的广袤领域中,数组作为一种极为重要的数据结构,发挥着不可或缺的作用。它就像一个有序的 “数据仓库”,能高效地存储和管理大量数据。接下来,让我们深入了解数组的奥秘。

一、数组的维度与数学表示

(一)向量与一维数组

在数学世界里,向量可表示为\(A = (a_0, a_1, \cdots, a_{n - 1})\)。对应到计算机编程中,这便是一维数组的概念 —— 由n个元素按顺序依次排列而成,每个元素\(a_i\)(\(i = 0, 1, \cdots, n - 1\))都在数组里有着独一无二的位置。例如,在存储学生成绩时,我们可以创建一个一维数组,数组中的每个元素分别对应一位学生的成绩,方便快捷地对成绩数据进行处理和管理。

(二)矩阵与二维数组

矩阵的数学表达式为\(A_{m×n}=\begin{bmatrix}a_{00}&a_{01}&\cdots&a_{0,n - 1}\\a_{10}&a_{11}&\cdots&a_{1,n - 1}\\\cdots&\cdots&\cdots&\cdots\\a_{m - 1,0}&a_{m - 1,1}&\cdots&a_{m - 1,n - 1}\end{bmatrix}\)。二维数组可视作由m行n列元素构成的矩阵,其中每个元素\(a_{ij}\)(\(i = 0, 1, \cdots, m - 1\);\(j = 0, 1, \cdots, n - 1\))都能通过其所在的行和列唯一确定。在表示棋盘状态时,二维数组大显身手,棋盘上每个格子的信息都能精准地存储在对应的数组元素中。

(三)n 维数组的概念拓展

随着维度的增加,数组变得更加复杂和灵活。当数组的下标由n个数组成时,就形成了n维数组。访问这类数组中的元素,需要用到n个索引值。以三维数组为例,它常被用于三维图形处理、气象数据存储(涉及空间的x、y、z坐标以及时间等维度)等场景。依此类推,n维数组能够借助n个下标确定唯一的元素,为处理复杂的数据关系和多维数据集合提供了强大的支持。

二、数组的存储特点

(一)内存连续存储

数组元素在内存中是按顺序连续存储的,这使得计算机在访问数组元素时能够快速定位,大大提高了数据的访问效率。

(二)存储分配方式

不同编程语言的数组存储分配方式有所不同。像C、\(C++\)、\(C\#\)等语言,数组按行进行存储分配;而Fortran语言则是按列进行存储分配。

(三)数组名的特性

数组名代表该数组在内存中的首地址,并且它是一个常量,在程序运行过程中不能被修改。

三、常用数组的存储细节

(一)一维数组

对于一维数组\(a[n]\),其各元素按照下角标依次存放。例如在\(C\#\)中,我们创建一个整型一维数组int[] a = new int[5];,假设每个元素占用的存储空间为c字节,那么第i个元素的存储地址\(Loc(a[i]) = Loc(a[0]) + i×c\) 。

(二)二维数组

以二维数组\(a[m,n]\)为例,在\(C\#\)中创建int[,] a = new int[2,3];。若每个元素占用c字节,其元素存储地址的计算公式为\(Loc(a[i,j]) = Loc(a[0,0]) + (i×n + j)×c\)。这种存储方式与二维数组的矩阵结构相对应,便于根据行和列的索引快速计算出元素的存储位置。

(三)三维数组

三维数组的存储更为复杂,以\(a[m,n,l]\)为例,如在\(C\#\)中创建int[,,] a = new int[2,3,4];。它的存储规律是第一维下标变化最慢,第三维(最后一维)下标变化最快。每个元素的存储地址计算公式为\(Loc(a[i,j,k]) = Loc(a[0,0,0]) + (i×n×l + j×l + k)×c\)。这种存储顺序符合人们对三维空间的认知逻辑,方便在处理三维数据时进行高效的访问和操作。

四、力扣实战:数组相关算法题解析

(一)最长连续序列(力扣 128 题)

  1. 题目描述:给定一个未排序的整数数组nums,要求找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度,并设计实现时间复杂度为\(O(n)\)的算法。
  2. 示例
    • 输入:nums = [100,4,200,1,3,2],输出:4,解释:最长数字连续序列是[1, 2, 3, 4],长度为4
    • 输入:nums = [0,3,7,2,5,8,4,6,0,1],输出:9
  3. 解题思路与代码实现

收起

python

from typing import Listclass Solution:def longestConsecutive(self, nums: List[int]) -> int:if not nums:  # 增加对空列表的错误处理return 0nums_set = set(nums)  # 使用集合来提高查找速度length = 0for num in nums_set:if num - 1 in nums_set:continuelst1 = self.findBig(num, nums_set, [num])if len(lst1) > length:length = len(lst1)return lengthdef findBig(self, num, nums_set, lst1):while num + 1 in nums_set:lst1.append(num + 1)num += 1return lst1

在这段代码中,首先将数组转换为集合,利用集合查找元素的时间复杂度为\(O(1)\)的特性,提高查找效率。然后遍历集合中的每个元素,若当前元素的前一个数不在集合中,则以此元素为起点,不断寻找连续的数字序列,记录下最长序列的长度并返回。

(二)两数之和(力扣 1 题)

  1. 题目描述:给定一个整数数组nums和一个整数目标值target,需要在数组中找出和为目标值target的两个整数,并返回它们的数组下标。假设每种输入只会对应一个答案,且不能使用两次相同的元素,可按任意顺序返回答案。
  2. 示例
    • 输入:nums = [2,7,11,15]target = 9,输出:[0,1],解释:因为nums[0] + nums[1] == 9,所以返回[0, 1]
    • 输入:nums = [3,2,4]target = 6,输出:[1,2]
  3. 解题思路与代码实现

收起

python

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:# 创建一个字典来存储数值与索引的对应关系num_to_index = {}# 遍历数组一次for i, num in enumerate(nums):# 计算需要的补数complement = target - num# 检查补数是否在字典中if complement in num_to_index:return [num_to_index[complement], i]# 将当前数值和索引存入字典num_to_index[num] = i# 如果没有找到符合条件的数值对,抛出异常raise ValueError("没有找到两个数,使它们的和等于目标值")

此代码通过创建一个字典,在遍历数组的过程中,将每个元素的值和索引存入字典。同时,每次计算当前元素的补数,并检查补数是否在字典中。若存在,则找到了满足条件的两个数,返回它们的索引;若遍历结束仍未找到,则抛出异常。

数组在数据存储和算法设计中占据着核心地位。深入理解数组的概念、存储特性以及在算法题中的应用,能够为我们在编程之路上打下坚实的基础,帮助我们更高效地解决各种复杂的问题。希望通过本文的分享,大家能对数组有更全面、更深入的认识,在编程实践中灵活运用数组知识,提升编程技能。

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

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

相关文章

ue5 创建多列StreeView的方法与理解

创建StreeView的多列样式怎么就像是创建单行单列差不多?貌似就是在单行单列中加入了多列widget? 示例代码 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailTabWidget){…

Linux之yum详解

—— 小 峰 编 程 目录 1、Linux软件的安装方式 2、什么是yum 3、配置网络yum源 4、yum命令 【语法】 【yum常用命令】 1、Linux软件的安装方式 在CentOS系统中,软件管理方式通常有三种方式: rpm安装 、 yum安装 以及 编译安装 。 2、什么是yum…

lvgl运行机制分析

lv_timer_handler() 是 LVGL 的“心脏”:这个函数会依次做以下事情: 处理定时器(如动画、延迟回调)。 读取输入设备(如触摸屏、按键的状态)。 刷新脏区域(仅重绘屏幕上发生变化的区域&#xf…

达梦数据库授权给某个用户查询其他指定用户下所有表的权限

方法1: 新版本有一个数据库参数 GRANT_SCHEMA,表示是否开启授予和回收模式权限功能。0:否;1:是 此参数为静态参数,默认是0,将改参数修改为1后,重启数据库生效。 将参数修改为1 S…

人大金仓国产数据库与PostgreSQL

一、简介 在前面项目中,我们使用若依前后端分离整合人大金仓,在后续开发过程中,我们经常因为各种”不适配“问题,但可以感觉得到大部分问题,将人大金仓视为postgreSQL就能去解决大部分问题。据了解,Kingba…

Python之参数星号(*)使用笔记

背景 在学习python时发现方法调用和方法定义会经常发现有带星号的标记,为了弄明白是怎么使用的。特此做个笔记。 一、参数符号对比速查表 符号类使用场景作用描述示例无符号函数定义/调用普通位置参数或关键字参数.def func(a, b)*函数定义收集多余位置参数为元组…

使用haproxy实现MySQL服务器负载均衡

一、环境准备 主机名IP地址备注openEuler-1192.168.121.11mysql-server-1openEuler-2192.168.121.12mysql-server-2openEuler-3192.168.121.13clientRocky-1192.168.121.51haproxy 二、mysql-server配置 [rootopenEuler-1 ~]# yum install -y mariadb-server [rootopenEuler…

Python与Web3.py库:构建去中心化应用的未来

Python与Web3.py库:构建去中心化应用的未来 在区块链的世界里,“去中心化”是最核心的理念之一,它赋予了用户更多的控制权和自由,消除了传统中心化系统中的单点故障和信任问题。而在这场技术革命中,Web3.0无疑是最受瞩…

对“预训练”的理解

预训练有什么用 传统的机器学习是偏数学的,对数据的量不做过多要求,而深度学习的项目通常是有大量的数据可供使用。 在平常的任务或者项目中,我们可能并没有大量数据,只有少量数据,在这时我们就可以通过“借用”有大…

VMware Ubuntu 共享目录

在VMware中挂载Ubuntu共享目录需要以下步骤,分为设置共享文件夹和在Ubuntu中挂载两部分: 一、VMware 设置共享文件夹 关闭Ubuntu虚拟机 在配置前,建议先关闭虚拟机(若已运行需关闭,部分VMware版本支持热添加&#xff0…

AF3 crop_chains函数解读

AlphaFold3 feature_processing_multimer模块的crop_chains函数的功能是对多条链的蛋白质结构预测任务中的MSA(多序列比对)特征和模板特征进行裁剪(cropping)。裁剪的目的是为了控制输入模型的MSA序列数量和模板数量,以适应模型的输入限制或优化计算效率。 源代码: def…

Java基础-数组,集合创建方式

Java 中 new 关键字的作用 在 Java 中,new 关键字用于 在堆内存中分配空间 并创建对象。 数组 和 集合 在 Java 中都是对象,因此必须使用 new 来创建实例。Java 和 C 之间的主要区别在于 内存管理 和 对象的创建方式。 Java 与 C 中数组 & 集合的创…

LeeCode题库第三十九题

39.组合总和 项目场景: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同…

大模型应用案例 | 大模型+金融运维,擎创携手某证券创新运维能力新范式

一、当大模型遇上金融运维:一场让告警处理“脱胎换骨”的变革 2022年底,ChatGPT的横空出世让AI技术彻底出圈;短短两年后,大模型已悄然潜入金融行业的“心脏地带”——运维系统。面对指数级暴增的告警信息、碎片化的处理流程&#…

【MongoDB】在Windows11下安装与使用

官网下载链接:Download MongoDB Community Server 官方参考文档:https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 选择custom类型,其他默认 注意,此选…

阿里云轻量级服务器通过宝塔安装PgVector要点

设置环境变量: export PG_HOME/www/server/pgsql export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/www/server/pgsql/lib export PG_CONFIG/www/server/pgsql/bin/pg_config export PGDATA/www/server/pgsql/data PATH$PATH:$HOME/.local/bin:$HOME/bin:$PG_HOME/bin ali…

OpenSSL 基础使用流程

理解 OpenSSL 的基础使用流程是学习如何进行安全通信的关键,特别是在实现 SSL/TLS 连接时。以下是 OpenSSL 基础使用流程的一个简要总结,并附上一个简单的示例代码,帮助你理解如何通过 OpenSSL 建立一个基本的安全通信连接。 OpenSSL 基础使…

什么是最终一致性,它对后端系统的意义是什么

最终一致性(Eventual Consistency)是分布式系统中的一种一致性模型。与传统的强一致性模型不同,最终一致性并不要求系统在任何时刻都保持一致,而是保证在足够的时间后,所有节点的数据最终会达到一致的状态。换句话说,系统允许短时间内出现数据的不一致性,但最终会通过某…

SQL命令详解之增删改数据

目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 ​3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中,增、删、改是最基础的操作,它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…

std::allocator_traits 能做但 std::allocator 不能的事情

🌟 std::allocator_traits 能做但 std::allocator 不能的事情 1️⃣ 适配自定义分配器 假设你要实现一个内存池 MyAllocator,而 STL 容器默认使用的是 std::allocator。 如果你希望 STL 容器可以使用你的 MyAllocator,你 不能直接用 std::a…