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学习第七天
数组:基础概念、存储特性及力扣实战应用 在计算机科学与数学的广袤领域中,数组作为一种极为重要的数据结构,发挥着不可或缺的作用。它就像一个有序的 “数据仓库”,能高效地存储和管理大量数据。接下来,让我们深入了解…...
Grafana使用日志7--开启Sigv4
背景 在Grafana中,有些data source是需要开启sigv4认证的,例如OpenSearch,这个配置项默认是关闭的,这里我们介绍一下怎么开启 步骤 传统方式 如果我们想在Grafana中开启sigv4认证,我们需要在grafana.ini中修改一个…...
【Redis】Redis 入门
借鉴枫枫知道 一、连接 redis 1.1 命令行连接 // 完整的命令 redis-cli -h 127.0.0.1 -p 6379 -a password// 简写 redis-cli// 认证,进行redis之后 auth password1.2 go 代码连接 package mainimport ("fmt""github.com/go-redis/redis" …...
一文了解:部署 Deepseek 各版本的硬件要求
很多朋友在咨询关于 DeepSeek 模型部署所需硬件资源的需求,最近自己实践了一部分,部分信息是通过各渠道收集整理,so 仅供参考。 言归正转,大家都知道,DeepSeek 模型的性能在很大程度上取决于它运行的硬件。我们先看一下…...
15.14 QLoRA量化低秩适配微调:华盛顿大学的显存优化革命
QLoRA量化低秩适配微调:华盛顿大学的显存优化革命 一、技术架构解析 #mermaid-svg-Rkx3w3RQJ1e7odbb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Rkx3w3RQJ1e7odbb .error-icon{fill:#552222;}#mermaid-svg-Rk…...
软件工程复试专业课-能力成熟度模型CMM
CMM CMM概念CMM的核心CMM来由CMM的目的成熟度等级初始级可重复级已定义级已管理级优化级 CMM概念 即能力成熟度模型,是对于软件组织在定义、实施、度量、控制和改善其软件过程的实践中各个发展阶段的描述。 CMM是改进软件过程的有效策略。它的基本思想是࿰…...
Dify使用和入门
第一步:了解 Dify 在开始之前,先简单了解一下 Dify 是什么: Dify 是一个开源的 LLM 应用开发平台,专注于帮助开发者快速构建生产级的生成式 AI 应用。它支持知识库集成、RAG(检索增强生成)技术、复杂工作…...
Mercury、LLaDA 扩散大语言模型
LLaDA 参考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo: https://chat.inceptionlabs.ai/ 速度很快生成...
Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(十二)
API 更改 ADS 功能增加了以下公共 API 功能: 枚举系统中的多路复用器设备。查询有关多路复用器的信息,例如,它连接了哪些目标,以及当前切换到哪个目标。触发多路复用器切换。如何检测多路复用器是否已切换。 枚举系统中的多路复…...
Windows环境下SuperMapGIS 11i 使用达梦数据库
1. 环境介绍: 1.1. 操作系统: windows server 2019 1.2. GIS 软件: 1.2.1. GIS 桌面 supermap-idesktopx-11.3.0-windows-x64-bin 下载链接:SuperMap技术资源中心|为您提供全面的在线技术服务 安装教程:绿色版&…...
Claude 3.7 Sonnet深度解析:混合推理模型如何重塑AI编程能力
引言 2025年2月25日,人工智能领域领先企业Anthropic正式发布了新一代大语言模型Claude 3.7 Sonnet。作为全球首个混合推理AI模型,Claude 3.7 Sonnet在编程开发、逻辑推理以及任务处理效率等方面实现了突破性进展。本文将从核心特性、性能评测、竞品对比…...
IP属地是通过卫星定位的吗?如何保护用户隐私
在数字时代,网络空间成为了人们日常生活不可或缺的一部分。随着社交媒体、在线服务等平台的兴起,用户IP属地信息的重要性日益凸显。然而,关于IP属地是如何确定的,尤其是是否通过卫星定位这一问题,却常常引发公众的疑问…...
金融赋能绍兴纺织 民生银行助力外贸中小微企业“走出去”
在浙江绍兴,纺织业作为一张熠熠生辉的产业名片,承载着深厚的历史底蕴与蓬勃的发展活力。这里依傍长三角经济圈,交通网络纵横交错,将原材料产地与广阔市场紧密相连;产业集群高度成熟,上下游产业链完备&#…...
标记符号“<”和“>”符号被称为“尖括号”或“角括号”
你提到的“<”和“>”符号被称为“尖括号”或“角括号”。它们常用于编程语言中表示类型参数(如泛型)、HTML标签(如<div>)、数学中的不等式(如< 5)等。 好的,我来用通俗的方式解…...
一键部署DeepSeek
腾讯Cloud Studio提供DeepSeek一键部署功能,0行代码,秒级部署使用! 重点是每月免费提供10000分钟! 不用等待模型下载,创建即可使用。 内置 Ollama、DeepSeek-R1 1.5B、7B、8B、14B 及 32B 模型。 热门模板 AI模板 前…...
科普:ROC AUC与PR AUC
在评价二分类模型性能时,有许多评价指标,其中,有一对是用面积AUC(Area Under the Curve)做评价的:ROC AUC与PR AUC 本文我们对ROC AUC与PR AUC进行多维度对比分析: 一、定义与核心原理 维度RO…...
自动化测试无法启动(java.net.SocketException)
在运行测试代码,对浏览器进行自动化操作时,遇到了以下问题,添加依赖,编写了测试代码,但是程序无法运行 这个有两种原因(我使用的是谷歌浏览器): 网络问题: 因为需要从GitHub上下载对应包,所以有时候可能会出现网络问题,这个时候可以打开VPN之后,重新对程序进行启动 浏览器版本…...
大白话解释xxl-job是什么 有什么用 怎么用
XXL-JOB是什么? XXL-JOB就像快递公司的“总调度中心”,专门帮你的程序在不同服务器之间协调和执行定时任务。比如你有个电商系统,每天凌晨要统计订单数据、每小时要发促销短信,这些定时任务交给XXL-JOB来统一管理,它能…...
STM32G473VET6 在 Keil MDK 下手动移植 FreeRTOS 指南
下面将详细介绍如何在 Keil MDK 环境下将 FreeRTOS 手动移植到 STM32G473VET6 微控制器上。内容涵盖工程创建、获取源码、文件组织、移植层适配、测试任务编写以及编译调试等步骤。 1. 工程搭建(Keil 项目创建) 创建基础工程:首先准备一个基…...
WPF中对滚动条进行平滑滚动
有时候我们在动态添加内容时,需要将滚动条滚动到指定内容处。 一般我们会调用ScrollViewer的ScrollToVerticalOffset(垂直方向)函数和ScrollToHorizontalOffset(水平方向)函数来控制滚动条滚动到指定位置。 正常滚动效…...
API,URL,Token,XML,JSON是干嘛的
API,URL,Token,XML,JSON是干嘛的 API的作用 API(Application Programming Interface,应用程序编程接口)是一组定义和协议,用于构建和交互软件应用程序。API允许不同的软件系统之间…...
Threejs 解析几何体提取顶点数据流程
目录 前言 原生WebGL 整体解析过程简介 顶点颜色属性Geometry.colors Geometry转化为BufferGeometry 相关函数 WebGLAttributes.js WebGLGeometries.js WebGLObjects.js WebGLRenderer.js WebGLRenderer.js 前言 解析几何体对象,提取顶点数据…...
浮动与清除浮动
浮动(float)是CSS中用于布局的重要属性,它使元素脱离正常的文档流,并向左或向右移动,直到碰到另一个浮动元素或父元素的边界。 浮动的定义和作用 定义:浮动是通过设置 float 属性使元素脱离正常的文档流&a…...
YOLOv5 + SE注意力机制:提升目标检测性能的实践
一、引言 目标检测是计算机视觉领域的一个重要任务,广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本,以其高效性和准确性在实际应用中表现出色。然而,随着应用场景的复杂化,传统的卷积神经网络在处…...
极简Redis速成学习
redis是什么? 是一种以键值对形式存储的数据库,特点是基于内存存储,读写快,性能高,常用于缓存、消息队列等应用情境 redis的五种数据类型是什么? 分别是String、Hash、List、Set和Zset(操作命…...
教育培训APP开发全攻略:从网校系统源码搭建到功能优化的技术方案
本篇文章,笔者将从网校系统源码搭建到功能优化的角度,全面解析教育培训APP的开发技术方案,帮助企业和开发者更好地理解如何提升在线教育平台的性能与用户体验。 一、教育培训APP开发的核心架构 教育培训APP的架构设计是其能否顺利运行和扩展…...
网络安全与认知安全的区别 网络和安全的关系
前言 说说信息安全 与网络安全 的关系 一、包含和被包含的关系 信息安全包括网络安全,信息安全还包括操作系统安全,数据库安全 ,硬件设备和设施安全,物理安全,人员安全,软件开发,应用安全等。…...
16.1 LangChain 表达式语言(LCEL)深度解析:构建灵活高效的大模型应用流水线
LangChain 表达式语言(LCEL)深度解析:构建灵活高效的大模型应用流水线 关键词:LangChain 表达式语言、LCEL 编程范式、大模型应用编排、流式处理优化、生产级链式开发 1. LCEL 设计哲学与核心优势 1.1 为何需要 LCEL? #mermaid-svg-pIEGtObTES1T3LgF {font-family:"…...
介绍微信小程序中页面的生命周期函数和组件的生命周期函数
1.1 页面生命周期函数 这些函数主要用于管理页面的显示和隐藏。 onLoad(options): 页面加载时触发,options 是页面路由参数,可以在这里初始化数据。每当用户进入该页面时都会调用这个函数。 onShow(): 页面显示时触发。每当页面从后台切换到前台时都会…...
arm | lrzsz移植记录
1 我的使用场景 开发板无网络, 无奈只得用U盘拷贝文件 文件不大, 每次都插拔U盘, 很繁琐 原来的环境不支持rz等命令 就需要移植这个命令来使用 下载地址 https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2 编译脚本 # 主要内容在这里 configure_for_arm(){mkdir -p $PA…...
