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

数组(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.pswp.cn/diannao/85215.shtml

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

相关文章

ZYNQ sdk lwip配置UDP组播收发数据

🚀 一、颠覆认知:组播 vs 单播 vs 广播 通信方式目标设备网络负载典型应用场景单播1对1O(n)SSH远程登录广播1对全网O(1)ARP地址解析组播1对N组O(1)视频会议/物联网群控创新价值:在智能工厂中,ZYNQ通过组播同时控制100台AGV小车,比传统单播方案降低92%网络流量! 🔧 二、…

机器学习:欠拟合、过拟合、正则化

本文目录&#xff1a; 一、欠拟合二、过拟合三、拟合问题原因及解决办法四、正则化&#xff1a;尽量减少高次幂特征的影响&#xff08;一&#xff09;L1正则化&#xff08;二&#xff09;L2正则化&#xff08;三&#xff09;L1正则化与L2正则化的对比 五、正好拟合代码&#xf…

Linux命令之ausearch命令

一、命令简介 ausearch 是 Linux 审计系统 (auditd) 中的一个实用工具,用于搜索审计日志中的事件。它是审计框架的重要组成部分,可以帮助系统管理员分析系统活动和安全事件。 二、使用示例 1、安装ausearch命令 Ubuntu系统安装ausearch命令,安装后启动服务。 root@testser…

mac电脑安装nvm

方案一、常规安装 下载安装脚本&#xff1a;在终端中执行以下命令来下载并运行 NVM 的安装脚本3&#xff1a; bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置环境变量&#xff1a;安装完成后&#xff0c;需要配置环境变量。如…

Excel 操作 转图片,转pdf等

方式一 spire.xls.free&#xff08;没找设置分辨率的方法&#xff09; macOs开发Java GUI程序提示缺少字体问题解决 Spire.XLS&#xff1a;一款Excel处理神器_spire.xls免费版和收费版的区别-CSDN博客 官方文档 Spire.XLS for Java 中文教程 <dependency><groupI…

oracle goldengate实现远程抽取postgresql 到 postgresql的实时同步【绝对无坑版,亲测流程验证】

oracle goldengate实现postgresql 到 postgresql的实时同步 源端&#xff1a;postgresql1 -> postgresql2 流复制主备同步 目标端&#xff1a;postgresql 数据库版本&#xff1a;postgresql 12.14 ogg版本&#xff1a;21.3 架构图&#xff1a; 数据库安装以及流复制主备…

2.从0开始搭建vue项目(node.js,vue3,Ts,ES6)

从“0到跑起来一个 Vue 项目”&#xff0c;重点是各个工具之间的关联关系、职责边界和技术演化脉络。 从你写代码 → 到代码能跑起来 → 再到代码可以部署上线&#xff0c;每一步都有不同的工具参与。 &#x1f63a;&#x1f63a;1. 安装 Node.js —— 万事的根基 Node.js 是…

MQTT的Thingsboards的使用

访问云服务 https://thingsboard.cloud/ 新建一个设备 弹出 默认是mosquittor的客户端。 curl -v -X POST http://thingsboard.cloud/api/v1/tnPrO76AxF3TAyOblf9x/telemetry --header Content-Type:application/json --data "{temperature:25}" 换成MQTTX的客户…

金砖国家人工智能高级别论坛在巴西召开,华院计算应邀出席并发表主题演讲

当地时间5月20日&#xff0c;由中华人民共和国工业和信息化部&#xff0c;巴西发展、工业、贸易与服务部&#xff0c;巴西公共服务管理和创新部以及巴西科技创新部联合举办的金砖国家人工智能高级别论坛&#xff0c;在巴西首都巴西利亚举行。 中华人民共和国工业和信息化部副部…

BLE协议全景图:从0开始理解低功耗蓝牙

BLE(Bluetooth Low Energy)作为一种针对低功耗场景优化的通信协议,已经广泛应用于智能穿戴、工业追踪、智能家居、医疗设备等领域。 本文是《BLE 协议实战详解》系列的第一篇,将从 BLE 的发展历史、协议栈结构、核心机制和应用领域出发,为后续工程实战打下全面认知基础。 …

表单校验代码和树形结构值传递错误解决

表单校验代码&#xff0c;两种方式校验&#xff0c;自定义的一种校验&#xff0c;与element-ui组件原始的el-form表单的校验不一样&#xff0c;需要传递props和rules过去校验 const nextStep () > {const data taskMsgInstance.value.formDataif(data.upGradeOrg ) {elm…

vscode 配置 QtCreat Cmake项目

1.vscode安装CmakeTool插件并配置QT中cmake的路径&#xff0c;不止这一处 2.cmake生成器使用Ninja&#xff08;Ninja在安装QT时需要勾选&#xff09;&#xff0c;可以解决[build] cc1plus.exe: error: too many filenames given; type ‘cc1plus.exe --help’ for usage 编译时…

关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别

我们谈论数据中台之前&#xff0c; 我们也听到过数据平台、数据仓库、数据湖、湖仓一体的相关概念&#xff0c;它们都与数据有关系&#xff0c;但他们和数据中台有什么样的区别&#xff0c; 下面我们将围绕数据平台、数据仓库、数据湖和数据中台的区别进行介绍。 一、相关概念…

WIN11+eclipse搭建java开发环境

环境搭建&#xff08;WIN11ECLIPSE&#xff09; 安装JAVA JDK https://www.oracle.com/cn/java/technologies/downloads/#jdk24安装eclipse https://www.eclipse.org/downloads/ 注意&#xff1a;eclipse下载时指定aliyun的软件源&#xff0c;后面安装会快一些。默认是jp汉化e…

通义灵码深度实战测评:从零构建智能家居控制中枢,体验AI编程新范式

一、项目背景&#xff1a;零基础挑战全栈智能家居系统 目标&#xff1a;开发具备设备控制、环境感知、用户习惯学习的智能家居控制中枢&#xff08;PythonFlaskMQTTReact&#xff09; 挑战点&#xff1a; 需集成硬件通信(MQTT)、Web服务(Flask)、前端交互(React) 调用天气AP…

【Python进阶】CPython

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心架构图解💡 核心作用讲解🔧 关键技术模块说明⚖️ Python实现对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:查看字节码案例…

Hive中资源优化方法的详细说明

在Hive中&#xff0c;资源优化的核心目标是合理分配集群资源&#xff08;如内存、CPU、任务并行度等&#xff09;&#xff0c;避免资源竞争和浪费&#xff0c;提升查询效率。以下是资源优化的具体方法&#xff0c;涵盖 YARN资源配置、任务并行度、内存管理、JVM重用、推测执行 …

流媒体协议分析:流媒体传输的基石

在流媒体传输过程中&#xff0c;协议的选择至关重要&#xff0c;它决定了数据如何封装、传输和解析&#xff0c;直接影响着视频的播放质量和用户体验。本文将深入分析几种常见的流媒体传输协议&#xff0c;探讨它们的特点、应用场景及优缺点。 协议分类概述 流媒体传输协议根据…

GitHub 趋势日报 (2025年05月29日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1864 agenticSeek 753 langflow 749 n8n 736 prompt-eng-interactive-tutorial 42…

Jenkins-Pipeline:学习笔记

Jenkins-Pipeline:学习笔记 在 DevOps 领域中,Pipeline(流水线) 是实现持续集成(CI)和持续部署(CD)的核心机制。学习 Pipeline 通常需要从以下几个方面入手,涵盖基础概念、工具使用、语法规则、实践优化等 一、Pipeline 基础概念 什么是 Pipeline? 流水线是将软件交…