当前位置: 首页 > news >正文

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 List

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

    def findBig(self, num, nums_set, lst1):
        while num + 1 in nums_set:
            lst1.append(num + 1)
            num += 1
        return 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("没有找到两个数,使它们的和等于目标值")

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

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

相关文章:

  • 1. 搭建前端+后端开发框架
  • c语言实现三子棋小游戏(涉及二维数组、函数、循环、常量、动态取地址等知识点)
  • C语言 第二章 (2)
  • c++中迭代器和指针有什么区别?
  • 揭开人工智能中 Tokens 的神秘面纱
  • DeepSeek核心技术优势总结
  • 部署Joplin私有云服务器postgres版-docker compose
  • GD32F30X系列的keil5 搭建
  • 【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.2Kibana可视化初探
  • Halcon图像预处理算子 sobel算子、傅里叶变换算子、卷积算子
  • 【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用
  • OptiTrack光学跟踪系统:引领工厂机器人应用的革新浪潮
  • 【统计的思想】基于马尔科夫链的测试
  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(7)
  • Android APK组成编译打包流程详解
  • Muduo + OpenSSL 网络交互完整流程
  • ubuntu系统安装playhouse三方库
  • 高性能PHP框架webman爬虫引擎插件,如何爬取数据
  • 2025-02-28 学习记录--C/C++-C语言 scanf 中,%s 不需要加
  • 面试(进阶) —虚拟列表在什么场景使用,如何实现?
  • 麻江网站建设/如何建网站不花钱
  • 咸阳网站网站建设/免费seo快速排名工具
  • 信息网站建设预算/资源猫
  • 电脑网站建设规划/做微商怎么找客源加人
  • 做转运网站/浙江网络科技有限公司
  • 婚纱网站制作/电商网站建设开发