一起学数据结构和算法(二)| 数组(线性结构)

news2025/5/29 13:03:30

数组(Array)

数组是最基础的数据结构,在内存中连续存储,支持随机访问。适用于需要频繁按索引访问元素的场景。


简介

数组是一种线性结构,将相同类型的元素存储在连续的内存空间中。每个元素通过其索引值(数组下标 index)来进行唯一标识和访问。

画板

核心特性

  1. 固定大小:在绝大多数语言中,数组创建后大小固定不变
  2. 连续内存:元素在内存中顺序存储,无额外开销
  3. 随机访问:O(1)时间复杂度直接访问任意元素
  4. 同质性:同意数组中所有元素类型相同
  5. 索引访问:通过数字索引访问元素

基本操作

时间复杂度分析
操作时间复杂度
访问O(1)
更新O(1)
遍历O(n)
搜索无序数组O(n);有序数组O(log n)(二分查找)
插入/删除在末尾O(1);在数组指定位置O(n)(需要移动元素)
代码实现
// 声明和初始化
int[] numbers = new int[5];  // 创建一个长度为5的int数组,默认值都是0
int[] primes = {1, 9, 78, 25, 3};  // 直接使用初始值创建数组

// 访问元素
int firstPrime = primes[0];  // 得到1

// 更新元素
numbers[0] = 10;

// 获取数组长度
int length = numbers.length;

// 遍历数组
for (int i = 0; i < primes.length; i++) {
    System.out.println(primes[i]);
}

// 使用增强for循环遍历
for (int prime : primes) {
    System.out.println(prime);
}

/* 随机访问元素 */
int randomAccess(int[] nums) {
    // 在区间 [0, nums.length) 中随机抽取一个数字
    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);
    // 获取并返回随机元素
    int randomNum = nums[randomIndex];
    return randomNum;
}

优缺点

优点
  • 空间效率高:数组为数据分配了连续的内存块,无需额外的结构开销
  • 支持随机访问:数组允许在 O(1) 时间内访问任意元素
  • 缓存局部性:当访问数组元素时,计算机不仅会加载该数组,还会缓存其周围的其他数据,从而借助高速缓存来提升后续操作的执行速度
缺点
  • 插入与删除效率低:当数组中的元素较多时,插入/删除元素都得移动大量的元素
  • 长度不可变:数组在初始化后长度就固定了,扩容数组需要将原数组所有数据复制到新数组,开销很大
  • 空间浪费:如果数组空间分配大小超过了实际所需,多余空间容易浪费

应用场景

  • 随机访问:如果需要随机抽取一些样本,可以用数组存储,并生成一个随机序列,根据索引实现随机抽样
  • 排序和搜索:数组是排序和搜索算法中常用的数据结构。快速排序、归并排序、二分查找等都主要在数组上进行
  • 查找表:当需要快速查找一个元素或其对应关系时,可以使用数组作为查找表。如实现字符到 ascii 码的映射,可以将字符的 ascii 值作为索引,对应元素存放在数组中对应位置
  • 机器学习:神经网络中使用了大量的向量、矩阵、张量之间的线性代数运算,这些数据都是以数组的形式构建的。数组是神经网络编程中最常用的数据结构
  • 数据结构实现:数组可以用于实现栈、队列、哈希表、堆、图等数据结构

扩展

  • 二维数组
  • 多维数组

热门题目

  • 53. 最大子数组和
  • 11. 盛最多水的容器
  • 283. 移动零
  • 88. 合并两个有序数组
53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

示例:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

题解

动态规划

分而治之,避免重复计算

  1. 初始化
    1. maxSum 设置为数组第一个元素
    2. currentSum 也设置为第一个元素(子数组最少包含一个元素)
  2. 遍历数组
    1. 从第二个元素开始遍历
    2. 对于每个元素 nums[i],有两种选择:
      1. 将其加入到之前的子数组,即 currentSum + nums[i]
      2. 重新开始一个子数组,只包含当前元素,即 nums[i]
    3. 选择最大的作为新的 currentSum
    4. 最后,更新 maxSum,保证其是currentSummaxSum中最大的值
class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = nums[0];
        int currentSum = nums[0];

        for(int i = 1; i < nums.length; i++) {
            // 是将当前元素加入到之前的子数组,还是重新开始一个子数组
            currentSum = Math.max(currentSum + nums[i], nums[i]);
            // 更新最大子数组和
            maxSum = Math.max(currentSum, maxSum);
        }

        return maxSum;
    }
}

参考资料

[1] Hello 算法
[2] 算法导航

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

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

相关文章

Linux基本指令篇 —— touch指令

touch是Linux和Unix系统中一个非常基础但实用的命令&#xff0c;主要用于操作文件的时间戳和创建空文件。下面我将详细介绍这个命令的用法和功能。 目录 一、基本功能 1. 创建空文件 2. 同时创建多个文件 3. 创建带有空格的文件名&#xff08;需要使用引号&#xff09; 二、…

【后端高阶面经:消息队列篇】23、Kafka延迟消息:实现高并发场景下的延迟任务处理

一、延迟消息的核心价值与Kafka的局限性 在分布式系统中,延迟消息是实现异步延迟任务的核心能力,广泛应用于订单超时取消、库存自动释放、消息重试等场景。 然而,Apache Kafka作为高吞吐的分布式消息队列,原生并不支持延迟消息功能,需通过业务层或中间层逻辑实现。 1.1…

Mac安装MongoDB数据库以及MongoDB Compass可视化连接工具

目录 一、安装 MongoDB 社区版 1、下载 MongoDB 2、配置环境变量 3、配置数据和日志目录 4、启动MongoDB服务 5、使用配置文件启动 6、验证服务运行 二、MongoDB可视化工具MongoDB Compass 一、安装 MongoDB 社区版 1、下载 MongoDB 大家可以直接在官方文档下安装Mo…

城市地下“隐形卫士”:激光甲烷传感器如何保障燃气安全?

城市“生命线”面临的安全挑战 城市地下管网如同人体的“血管”和“神经”&#xff0c;承载着燃气、供水、电力、通信等重要功能&#xff0c;一旦发生泄漏或爆炸&#xff0c;将严重影响城市运行和居民安全。然而&#xff0c;由于管线老化、违规施工、监管困难等问题&#xff0…

MySQL推出全新Hypergraph优化器,正式进军OLAP领域!

在刚刚过去的 MySQL Summit 2025 大会上&#xff0c;Oracle 发布了一个用于 MySQL 的全新 Hypergraph&#xff08;超图&#xff09;优化器&#xff0c;能够为复杂的多表查询生成更好的执行计划&#xff0c;从而优化查询性能。 这个功能目前只在 MySQL HeatWave 云数据库中提供&…

飞牛fnNAS手机相册备份及AI搜图

目录 一、相册安装应用 二、手机开启自动备份 三、开始备份 四、照片检索 五、AI搜图设置 六、AI搜图测试 七、照片传递 现代的手机,已经成为我们最亲密的“伙伴”。自从手机拍照性能提升后,手机已经完全取代了简单的卡片相机,而且与入门级“单反”相机发起了挑战。在…

消费类,小家电产品如何做Type-C PD快充快速充电

随着快充技术的快速发展现在市场上的产品接口都在逐渐转为Type-C接口&#xff0c;Type-C可以支持最大20V100W的功率。未来Type-C大概会变成最通用的接口&#xff0c;而你的产品却还是还在用其他的接口必然会被淘汰, 而要使小家电用到PD快充&#xff0c;就需要使用到Type-C快充诱…

连接表、视图和存储过程

1. 视图 1.1. 视图的概念 视图&#xff08;View&#xff09;&#xff1a;虚拟表&#xff0c;本身不存储数据&#xff0c;而是封装了一个 SQL 查询的结果集。 用途&#xff1a; 只显示部分数据&#xff0c;提高数据访问的安全性。简化复杂查询&#xff0c;提高复用性和可维护…

银河麒麟V10×R²AIN SUITE:用AI重构安全,以国产化生态定义智能未来

前言 银河麒麟是由国防科技大学研发、现由麒麟软件运营的国产操作系统&#xff0c;旨在打破国外技术垄断&#xff0c;保障国家信息安全。自2002年国家“863计划”启动以来&#xff0c;历经技术迭代与生态整合&#xff0c;现为国产操作系统领军品牌。其应用覆盖党政、国防、能源…

JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML和CSS系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff…

15.进程间通信(一)

一、进程间通信介绍 进程间通信目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另⼀个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xf…

AI 数据采集实战指南:基于 Bright Data 快速获取招标讯息

AI 数据采集实战指南&#xff1a;基于Bright Data快速获取招标讯息 在招标行业中&#xff0c;快速、准确地获取招标公告、项目详情、投标截止日期和其他关键招标信息&#xff0c;是投标企业提高竞标成功率的核心竞争力。然而&#xff0c;招标信息往往分散在不同的平台和网页&a…

cursor使用mcp

问题说明 mcp就相当于给AI安装了工具包&#xff0c;它可以调用获取接口文档&#xff0c;网页&#xff0c;数据库等&#xff0c;基本上所有的mcp都是node程序&#xff0c;少数需要python环境 使用说明 使用mcp-mysql举例&#xff0c;下面是配置json "mysql": {&qu…

小白成长之路-计算机网络(四)

文章目录 前言一、网络连接查看1.netstat2.ss3.bond绑定3.1准备好这三个文件3.2添加bond配置文件3.3关闭网络图形化服务3.4重启 4.Linux下的抓包工具Wireshark 5、web压力测试工具6、路由追踪命令 二、[练习题](https://blog.csdn.net/m0_70730767/article/details/148262716?…

【Agent】MLGym: A New Framework and Benchmark for Advancing AI Research Agents

arxiv: https://arxiv.org/pdf/2502.14499 简介 Meta 推出的 MLGym 框架及配套基准 MLGym-Bench&#xff0c;为评估和开发LLM Agent在 AI 研究任务中的表现提供了全新工具。作为首个基于 Gym 的机器学习任务环境&#xff0c;MLGym 支持强化学习等算法对代理的训练&#xff0c…

Web安全测试-文件上传绕过-DVWA

Web安全测试-文件上传绕过-DVWA 很多网站都有上传资源(图片或者文件)的功能&#xff0c;资源上传后一般会存储在服务器的一个文件夹里面&#xff0c;如果攻击者绕过了上传时候的文件类型验证&#xff0c;传了木马或者其他可执行的代码上去&#xff0c;那服务器就危险了。 我用…

现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践

通过 数学计算 CSS mask 复合遮罩 实现的真正几何内凹效果&#xff1a; 背景是一张图片&#xff0c;用来证明中间的凹陷是透明的。 完整代码&#xff1a; app.js import FormPage from "./pages/formPage"; import "./App.css"; const App () > {re…

【运维自动化-标准运维】如何实现在不同步骤间传递参数

当流程有多个步骤时&#xff0c;经常需要把前面某个个步骤处理的结果传递给下一个或后面的步骤使用&#xff08;输出作为输入&#xff09;&#xff0c;这就是跨步骤传参的场景&#xff0c;标准运维通过特有的标记符号"<SOPS_VAR>key:value</SOPS_VAR> "来…

[AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)

主流大模型特色对比表 模型核心优势适用场景局限性DeepSeek- 数学/代码能力卓越&#xff08;GSM8K准确率82.3%&#xff09;1- 开源生态完善&#xff08;支持医疗/金融领域&#xff09;7- 成本极低&#xff08;API价格仅为ChatGPT的2%-3%&#xff09;5科研辅助、代码开发、数据…

手机IP地址更换的影响与操作指南

在移动互联网时代&#xff0c;IP地址如同手机的“网络身份证”&#xff0c;其变更可能对上网体验、隐私安全及服务访问产生连锁反应。无论是为了绕过地域限制、保护隐私&#xff0c;还是解决网络冲突&#xff0c;了解IP更换的影响与正确操作方法都至关重要。本文将系统分析影响…