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 题)
- 题目描述:给定一个未排序的整数数组
nums
,要求找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度,并设计实现时间复杂度为\(O(n)\)的算法。 - 示例
- 输入:
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
。
- 输入:
- 解题思路与代码实现
收起
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 题)
- 题目描述:给定一个整数数组
nums
和一个整数目标值target
,需要在数组中找出和为目标值target
的两个整数,并返回它们的数组下标。假设每种输入只会对应一个答案,且不能使用两次相同的元素,可按任意顺序返回答案。 - 示例
- 输入:
nums = [2,7,11,15]
,target = 9
,输出:[0,1]
,解释:因为nums[0] + nums[1] == 9
,所以返回[0, 1]
。 - 输入:
nums = [3,2,4]
,target = 6
,输出:[1,2]
。
- 输入:
- 解题思路与代码实现
收起
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("没有找到两个数,使它们的和等于目标值")
此代码通过创建一个字典,在遍历数组的过程中,将每个元素的值和索引存入字典。同时,每次计算当前元素的补数,并检查补数是否在字典中。若存在,则找到了满足条件的两个数,返回它们的索引;若遍历结束仍未找到,则抛出异常。
数组在数据存储和算法设计中占据着核心地位。深入理解数组的概念、存储特性以及在算法题中的应用,能够为我们在编程之路上打下坚实的基础,帮助我们更高效地解决各种复杂的问题。希望通过本文的分享,大家能对数组有更全面、更深入的认识,在编程实践中灵活运用数组知识,提升编程技能。
相关文章:
AI学习第七天
数组:基础概念、存储特性及力扣实战应用 在计算机科学与数学的广袤领域中,数组作为一种极为重要的数据结构,发挥着不可或缺的作用。它就像一个有序的 “数据仓库”,能高效地存储和管理大量数据。接下来,让我们深入了解…...

【uniapp原生】实时记录接口请求延迟,并生成写入文件到安卓设备
在开发实时数据监控应用时,记录接口请求的延迟对于性能分析和用户体验优化至关重要。本文将基于 UniApp 框架,介绍如何实现一个实时记录接口请求延迟的功能,并深入解析相关代码的实现细节。 前期准备&必要的理解 1. 功能概述 该功能的…...
XR应用测试:探索虚拟与现实的边界
引言 随着XR(扩展现实,Extended Reality)技术的快速发展,VR(虚拟现实)、AR(增强现实)和MR(混合现实)应用逐渐渗透到游戏、教育、医疗、工业等多个领域。对于…...
算法之算法思想
算法思想 ♥算法思想知识体系详解♥ | Java 全栈知识体系 经典算法思想总结 经典算法思想总结(含LeetCode题目推荐) | JavaGuide...

mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽
问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键,然后点击屏幕顶部的Wi-Fi图标;2.从下拉菜单中选择 “打开无线诊断”(Open Wireless Diagnostics);3.你可能会看到一个提示窗口,…...
物理竞赛中的线性代数
线性代数 1 行列式 1.1 n n n 阶行列式 定义 1.1.1:称以下的式子为一个 n n n 阶行列式: ∣ A ∣ ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}\mathbf A\end{vmatrix} \begin{vmatrix} a_{11…...

FFmpeg-chapter3-读取视频流(原理篇)
ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…...
机器视觉线阵相机分时频闪选型/机器视觉线阵相机分时频闪选型
在机器视觉系统中,线阵相机的分时频闪技术通过单次扫描切换不同光源或亮度,实现在一幅图像中捕捉多角度光照效果,从而提升缺陷检测效率并降低成本。以下是分时频闪线阵相机的选型要点及关键考量因素: 一、分时频闪技术的核心需求 多光源同步控制 分时频闪需相机支持多路光源…...
「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」
Python 自动化操作浏览器基础方法 在进行 Web 自动化测试时,操作浏览器是必不可少的环节。Python 结合 Selenium 提供了强大的浏览器操作功能,让我们能够轻松地控制浏览器执行各种任务。本文将详细介绍如何使用 Python 和 Selenium 操作浏览器的基本方法…...
矩阵系列 题解
1.洛谷 P1962 斐波那契数列 题意 大家都知道,斐波那契数列是满足如下性质的一个数列: F n { 1 ( n ≤ 2 ) F n − 1 F n − 2 ( n ≥ 3 ) F_n \left\{\begin{aligned} 1 \space (n \le 2) \\ F_{n-1}F_{n-2} \space (n\ge 3) \end{aligned}\right. …...

活动报名:Voice Agent 技术现状及应用展望丨 3.8 北京
「人人发言,所有人向所有人学习!」——Z 沙龙 「一起探索下一代语音驱动的人机交互界面。」——RTE 开发者社区 3 月 8 日周六下午,北京,「智谱 Z 计划&Z Fund」和「RTE 开发者社区」将合办一场 Voice Agent 主题的线下活动…...

【卡牌——二分】
题目 分析 发现答案具有二分性,果断二分答案 代码 #include <bits/stdc.h> using namespace std; using ll long long;const int N 2e510;int n, a[N], li[N]; ll m;bool check(int x) {ll t m;for(int i 1; i < n; i){if(a[i] > x) continue; //…...

《第十五部分》STM32之FLASH闪存(终结篇)
本章是江科大自学STM32的最后一章节,历经2个月的断断续续时间,终于学到了最后,总结,这次的学习历程,相对于学习51还是略出一些难度,也就是若你是非科班,学习起来还是有一定的难度的,…...
属性的设置
笔记 class Student:def __init__(self, name, gender):self.name nameself.__gender gender # self.__gender 是私有的实例属性# 使用property 修改方法,将方法转成属性使用propertydef gender(self):return self.__gender# 将我们的gender这个属性设置为可写属…...

本地部署Deepseek+Cherry Studio
为啥要本地部署deepseek? 因为给deepseek发送指令得到服务器繁忙的回馈,本地部署会运行的更快 1.Ollama安装与部署 Ollama是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计 winR——cmd——ol…...

CMU15445(2023fall) Project #2 - Extendible Hash Index 匠心分析
胡未灭,鬓已秋,泪空流 此生谁料 心在天山 身老沧州 ——诉衷情 完整代码见: SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determinati…...
【VSCode】VSCode下载安装与配置极简描述
VSCode 参考网址:[Visual Studio Code Guide | GZTime’s Blog]. 下载安装 下载地址:Download Visual Studio Code - Mac, Linux, Windows. 注:推荐不更改安装位置,并且在附加任务中“其他”中的四项全部勾选,即将用…...

【前端基础】Day 5 CSS浮动
目录 1. 浮动 1.1 标准流(普通流/文档流) 1.2 浮动 1.2.1 浮动的特性 1.2.2 浮动元素常和标准流父级搭配使用 1.2.3 案例 2. 常见网页布局 2.1 常见网页布局 2.2 浮动布局注意点 3. 清除浮动 3.1 原因 3.2 清除浮动的本质 3.3 清除浮动的方…...
处理DeepSeek返回的markdown文本
处理DeepSeek返回的markdown文本 markdown预览组件,支持公式显示,支持uniapp。 相关依赖 markdown-itmarkdown-it-mathjaxmarkdown-it-katexmarkdown-it-latexkatexgithub-markdown-css 组件源码 <!--* Description: markdown显示组件* Author: wa…...
互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书
一、项目概述 1.1 项目背景 随着互联网技术的飞速发展以及人们生活品质的显著提升,传统房产交易、装修设计、家居购物等领域暴露出诸多问题。信息不对称使得用户难以获取全面准确的信息,在房产交易中可能高价买入或低价卖出,装修时可能遭遇…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...