【图解】ACM 选手带你玩转数组。

LeetCode刷题(ACM模式)-01数组 阅读详情

大家好呀,我是蛋蛋。瞎起题目的嘴强王者,乱写界的无冕之王。

提到数组,想必臭宝们都不陌生。说不定已经昂起脑瓜抖着腿,小眼神儿斜着来一句:“就那个随随便便用脚趾甲就能学会的数组?”

数组,你确定很简单?

自信点,语气肯定点,数组确实很简单。

但是我还要讲。

当然开始之前,你要确定你先看过下面这篇:

保姆级教学!彻底学会时间复杂度和空间复杂度

。。。


数组,一种基础的的线性数据结构。不管写什么代码基本上都会用到数组,它也是面试中面试官喜欢提问的高频问题。

鉴于它劳模的身份,对数组的考察基本都是考察代码方面的问题。

但是万变不离其宗,解决数组方面问题的万能钥匙,其实就是深刻的认识数组本身的深浅。

什么是数组?

首先什么是数组?

数组是一种基础的线性数据结构,它是用连续的一段内存空间,来存储相同数据类型数据的集合。

这里面有两个重点:

  • 线性数据结构

  • 连续内存存储相同数据类型

线性数据结构

线性数据结构,顾名思义,像线一样的数据结构,又硬又直的典型代表。

线性数据结构是有限的,它是某类元素的集合并且记录着元素之间的一组顺序关系,除了首尾之外,其余元素之间有且只有一个前驱和后继。

除了数组以外,像单链表、栈、队列等也是典型的线性数据结构。

连续内存存储的相同数据类型

以一个长度为 6 的 int 类型的数组为例,理解一下“连续内存存储相同数据类型”数组的样砸。

上图中的计算机给数组 a 分配了一块连续的内存空间 1000 - 1005,首地址 address[0] = 1000。

因为连续,且对于数组来说下标从 0 开始的,所有对于数组中的每个元素来说,它的内存地址就很好计算:

address[i] = address[0] + i 

数组的操作

从上面可以看出,连续内存存储使得数组有一个天然的优势,这个优势就是可以根据下标,快速的随意访问任意一个位置的数**组元素。**

因为数组可以保证不管你访问哪个元素,只要给出下标,只需进行一次操作,就可以定位到元素的位置,从而拿出这个位置上的值。

这步操作的时间复杂度就是 O(1)。

当然 God 是公平的,在查找上让数组当了快男,那必定让它在插入和删除上加上“持久”技能点。

在这你要明白,持久意味着花的时间多(低效)。这么看来,在数据结构与算法中,秒男成了褒义词。

这种插入和删除的“持久”,是如何产生的呢?

这还是要从“连续内存存储”上找原因,真所谓快也它,慢也它。

连续的内存使得在插入或者删除的元素的时候,其它元素也要相应的移动。

比如我们在下标为 2 的位置上插入一个元素 29:

为了保持连续内存存储,在下标为 2 的位置上插入 29,原先 2 - 5 下标位置上元素都要向后一步走,可以看出这一步操作的时间复杂度为 O(n)。

当然在这我必须要强调一点的是,插入的时间复杂度其实根据情况的不同而不同,在这里主要因为 懒 手疼,没有都列出来,毕竟我的臭宝们是最聪明哒。

一般我都是按照最坏情况时间复杂度来算。对于插入来说,最好的情况肯定是插在末尾,这样所有的元素都不用动,时间复杂度为 O(1),那最坏的情况就是在数组的开头插入,这样所有的元素都要动,时间复杂度就成了 O(n),请大家一定要注意。

对删除来说,和插入操作也差不多,比如我们删除下标为 2 位置上的元素。

删除了下标 2 位置上的数字 a[2], 原来下标 3 - 5 位置上的元素统统向前一步走。

同样对于删除来说,最好情况是删除末尾的元素,时间复杂度为 O(1),最坏的情况是删除首位的元素,时间复杂度是 O(n)。

数组的查找、插入和删除这 3 个操作讲完以后,还有最后一点提醒一下大家,在做数组类问题的时候要注意数组越界的问题。

数组越界,简单来说就是对于一个大小为 n 的数组,它的下标应是 0 到 n-1,对这 n 个位置的元素之外的访问,就是非法的,这就叫做“越界”。

比如对于下面这两行代码:

lst = [1,2,3,4]
print(lst[4])

编译一下,就会提示 IndexError : list index out of range。

臭宝们平时写数组的时候一定要注意,不然一不小心就 out 了。


到这里,简单的数组就讲完啦,能忍着看到这的都是真爱呀。码字码的手都痛啦,点赞么么哒给我刷起来~

我是蛋蛋,咱们下次见~

推荐阅读 👍:ACM 选手带你玩转时间复杂度和空间复杂度

acm中数组数组 适合刚学树状数组者,讲的很好,用心体会,用心理解,很容易学号树状数组。 立即下载

相关推荐

ACM大牛总结的线段树专辑,超经典的-1

ACM大牛总结的线段树专辑,超经典的-1,ACM竞赛必备数据结构。

C语言数组—经典“三子棋”小游戏

c语言数组和三子棋小游戏

qq_74009838的博客 1134

o型圈沟槽设计_O型密封圈——详细选型过程及步骤

一、密封圈常用材料二、密封圈常用密封形式密封圈分为活塞密封,活塞杆密封,端面密封,旋转密封。三、O型密封圈的选型规则O型密封圈的尺寸图径向安装O型圈选型(静态和动态运动)活塞杆密封选择适当规格的O形圈时,应该保证其外径(d1+2*d2)至少等于或者大于沟槽外径d6;当选择的O形圈直径d1大于250 mm时, O形圈外径将不能超过沟槽外径的3%;当选择的O形圈直径d1小于250mm时, O形圈外径将...

weixin_39856630的博客 2万+

全局变量和局部变量,2017.2.19

因为全局变量是存储在静态存储区分配的,这个空间很大 局部变量是在栈空间上分配的,栈空间没那么大,太大了会溢出

henuzxy 584

机械臂抓取前言

机械臂相关的笔记

weixin_64037619的博客 3909

DeepSeek绝了!3分钟生成PPT,专治“五彩斑斓的黑“!!(保姆教程)

DeepSeek绝了!3分钟生成PPT,专治"五彩斑斓的黑"!!(保姆教程)

yizhen91y的博客 4万+

ACM竞赛策略及小注意事项

ACM 竞赛注意事项

m0_71417856的博客 2779

ICT模拟零件测试方法--电容测试

通常,小到 100 pF 的电容需要补偿,因为夹具和系统的电容(20 到 50 pF)相对于被测设备的值是显著的。软件在需要补偿的电容测试中加入 comp 选项,而在不需要补偿的电容测试中加入 nocomp 选项。在调试期间,通过向电容语句添加 pc 选项验证您的电容测试。在测试单独的电容时,从测量结果中减去学到的值,然后与测试限制进行比较以决定通过或失败。请注意,如果用于需要补偿的电容测试上的感应总线使用了单独的探针,测量将无效。在测试电容时,应注意两个方面:电容的电阻元件,以及夹具和系统本身的电容。

可可南木的博客 1221

LeetCode ACM模式——数组篇

刷题顺序及思路均来源于代码随想录。 给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。

zssxcj的博客 995

RFSoC应用XCZU47DR八发八收FPGA设计方案

本文介绍了基于Xilinx XCZU47DR RFSoC芯片的八发八收FPGA设计方案。该方案采用集成射频数据转换器的SoC架构,支持8路14bit ADC(5GSPS)和8路14bit DAC(9.85GSPS),可直接处理5GHz以下射频信号。硬件设计包含高性能输入缓冲器、QMC校正和复杂混频器,适用于5G/6G通信、雷达、卫星通信等领域。文章详细阐述了ADC/DAC子系统参数,包括通道配置、采样率、带宽等特性,并提供了FPGA顶层模块的硬件接口设计,展示了多通道数据收发处理能力。该方案无需外置混频器,

toonyhe的博客 1794

CUDA-GDB(11)——调试示例演练

本博客包含三个CUDA-GDB的演练示例: ​​​​▶ Example: bitreverse ▶ Example: autostep ▶ Example: MPI CUDA Application

AI-安全-功耗 1515

【ACM】处理数组

题目 第一行T,代表即将输入T个矩阵 第二行开始就是T个矩阵,矩阵前有它们的行数和列数m和n 随后跟着m行矩阵内容,每一行都是n个数字 比如 2 4 4 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 0 1 T=2, 思路 java中用ArrayList来保存数组,是没办法转成静态数组arr的,所以需要想办法解决 原来ACM格式的输入,一旦遇到很多个数组 ,那需要单独拿函数处理一个矩阵,在主函数中循环T次读取,每次读取一个矩阵,立马处理然后打印输出结果,下一次调用函数时,a

weixin_52427290的博客 386

小目标检测之改进的YOLOV11算法

MASF-YOLO通过多尺度特征聚合注意力增强自适应融合三大核心创新,显著提升了无人机视角下的小目标检测性能。

hasakie的博客 1720

acm--数组应用

的

♛ 走心。的专栏 1071

电子电器架构 --- OEM企标中规定ECU启动时间的目的

电子电器架构 --- OEM企标中规定ECU启动时间的目的

Soly_kun的博客 224

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ACM学习历程28——利用数组下标

数组是在ACM程序设计大赛中经常用到的一类复合数据类型,对于一个数组类型的变量,我们可在变量声明的时候声明变量的类型,例如:整型数组、字符数组等。对于普通字符数组,其实是数组每个单元中存储了一个字符;对于字符串,实际上除了在每个存储位置存储了一个一个字符外,在字符串结束的位置还额外存储了一个’\0’作为字符串借书的标志。在这篇博文中,并不介绍数组在存储上的一些特性,只是想说明在解答题目的过程中,若是

u010480899的博客 1121

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数组访问越界问题

      1、什么是数组访问越界?我们通过数组的下标来得到数组内指定索引的元素。这称作对数组的访问。如果一个数组定义为有n个元素,那么,对这n个元素(下标为0 到n-1的元素)的访问都合法,如果对这n个元素之外的访问,就是非法的,称为“越界。数组占用了一段连续的内存空间。然后,我们可以通过指定数组下标来访问这块内存里的不同位置。因此,当你的下标过大时,访问到的

gcyy0106的专栏 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

解决数组越界问题

在数组的操作中难免会出现数组的越界问题,尤其是在我们用For循环对数组遍历又要删除数组元素的时候更容易出现数组越界的问题,我在找的过程中用到了OC的遍历数组的方法之后,发现没有再出现数组的越界问题,程序也不再闪退,下面的是我的代码//_RemoveArray是你要遍历的数组 [_RemoveArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NS

chenqiangblogs的博客 1万+

ACM常见错误提示及可能的解决办法

Waiting:你的程序刚刚提交,正在等待OJ评测你的程序。 Compiling:OJ正在编译你的程序。 Accepted:OK!你的程序是正确的 。 Wrong Answer:你的程序运行的结果和正确结果不同。状态页面CASE那一览显示的是你的程序在第几个样例上出错的。 Time Limit Exceeded:你的程序运行时间太长了,超过了对应题目的时间限制。 Memory Limit Exce...

寒泉 1万+

ACM比赛中常见的错误

常见错误 原因分析 Runtime Error 表示程序因为非法内存访问或未处理异常而结束,常见的有数组越界等 Memory Limit Exceeded 表示程序使用的内存超过规定的内存限制 Time Limit Exceeded 表示程序运行的时间超过题目规定的时间 Output Limit Exceeded 表示程序输出的内容过多,超过了

HachiLin的博客 3383

POJ 2000 Glod Conins(我的水题之路——之后的N天N个金币,打表)

Gold Coins Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17061   Accepted: 10660 Description The king pays his loyal knight in gold coins. On the first d

1054

acm竞赛java很少,为什么B题java过不了,同样的做法java总是报数组越界

java写的题目总是报“请检查是否存在数组越界等非法访问情况”然后我试着打开了所有提交,发现所有通过的代码都是c++的。之前也遇到过这种情况,不知道怎么解决。哪位大佬可以解答一下吗?附上代码,检查过了应该不存在数组越界问题。import java.util.*;class Node{int next;int val;public Node(int next, int val) {this.next...

weixin_39842519的博客 214

C语言中的溢出(数组越界)

在C陷阱与缺陷中有一样例如下:#include <stdio.h> int main() { int i, a[10]; for(i = 1; i <= 10; ++i) a[i] = 0; return 0; }由于数组a只有10个元素,它们分在在a[0], a[1], ... , a[9], 该程序非法使用了a[10], 结果导致的是该...

HHHHHHep的博客 1万+
上一篇: 【第一课】保姆级教学,带你玩转时间复杂度和空间复杂度。
下一篇: 【实战】ACM 选手图解 LeetCode 移除元素
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值