数组(Array)

数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。

	// java 数组示例
int[] numbers1 = {2,0,2,3,9,23};
// 或者
int[] numbers2 = new int[6];

基本概念

数组基本概念 —— 数组索引、数组元素、数组长度

  • 数组索引(Index): 数组中的每个元素都有一个唯一的整数索引,从0开始计数。索引用于访问数组中的元素。
  • 数组元素(Element): 数组中的元素必须是相同类型的数据,可以是整数、浮点数、字符、对象等。
  • 数组长度(Length): 数组的长度是指数组中包含的元素数量。

其具备一些性质:

  • 连续存储(Contiguous Memory): 数组中的元素在内存中是连续存储的,这意味着通过索引可以直接计算出元素的地址。
  • 随机访问时间(Constant Time Access): 由于元素的连续存储和索引的存在,通过索引访问数组中的某个元素通常只需要常数时间O(1)。( PS: 什么叫随机访问? 是计算机领域的一个重要概念,指的是能够以大致相等的时间访问存储介质中的任何数据元素,而不受其物理存储位置顺序的限制。通俗点说,随便获取任意一个元素。)

基本应用(Basic)

数组的结构本身比较简单,在解决常见面试算法问题中灵活应用数组索引来访问数据是关键。

Leetcode 26. 删除有序数组中的重复项【简单】

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

LeetCode 674. 最长连续递增序列【简单】

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

双指针(Two Pointers)

一些资料上也有说双指针算法,笔者看来更倾向于是一种技巧,定义的两个索引指针 通过操作两个索引指针来获取问题答案。(PS:为什么这里叫指针?指针更多的是C语言中的概念,最早C语言解决算法问题比较多。)

根据指针移动 或者 所指位置不同,也有不少其他种分类的说法比如:对撞指针、快慢指针、分离指针等等;但其技巧本质都是在于操作两个指针索引,大可不必严格定义这些名称,需要的是抓住重点操作两个指针。

LeetCode 167. 两数之和 II - 输入有序数组【中等】

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

LeetCode 15. 三数之和【中等】

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

前缀和(Prefix Sum)

对于一些算法问题直接求解的思路可能计算量比较大,可以思考利用预处理一组特定的中间数据来进求解。类比就如同初中解一些几何题通过几条辅助线的解法,如果回顾学习辅助线的画法,往往先了解常见的画法;对于算法,前缀和就是“常见的辅助线画法”。

针对一些算法问题需要快速计算数组某个连续区间的数值和时,先计算前缀和数组会是一个很好的策略。相关推导如下:

LeetCode 1343. 大小为 K 且平均值大于等于阈值的子数组数目【中等】

给你一个整数数组 arr 和两个整数 k 和 threshold 。

请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。

示例 1:

输入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4

输出:3

解释:子数组 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分别为 4,5 和 6 。其他长度为 3 的子数组的平均值都小于 4 (threshold 的值)。

总结下

  • 介绍了数组的基本结构,三个基本概念: 数组索引、数组元素、数组长度;
  • 数组类基础题,关键在于灵活的三个基本概念;
  • 利用操作两个数组索引的编程技巧来解决问题(双指针);
  • 解决算法问题,求解C,可以先 A->B->C来进行思考,前缀和就是典型一种示例。

数据结构与算法 | 数组(Array)的更多相关文章

  1. JavaScript数据结构与算法-数组练习

    一. 创建一个记录学生成绩的对象,提供一个添加成绩的方法,以及一个显示学生平均成绩的方法. // 创建一个记录学生成绩的对象 const Students = function Students () ...

  2. Java数据结构和算法 - 数组

    Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...

  3. (二)Java数据结构和算法——数组

    一.数组的实现 上一篇博客我们介绍了一个数据结构必须具有以下基本功能: ①.如何插入一条新的数据项 ②.如何寻找某一特定的数据项 ③.如何删除某一特定的数据项 ④.如何迭代的访问各个数据项,以便进行显 ...

  4. JS数据结构与算法-数组结构

    数组结构 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构. 数组通常情况下用于存储一系列同一种数据类型的值. 但在JavaScript里,也可以在数组中保存不同类型的值. 但我们 ...

  5. 基于js的数据结构与算法-数组

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  6. C# 数据结构和算法-数组队列

    队列: 队列是一个有序列表,遵循先入先出原则,可以用数组或链表实现 使用场景 用于排队,按顺序执行 public static void Main(string[] args) { ArrayQueu ...

  7. Java数据结构和算法 - OverView

    Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必 ...

  8. 数据结构和算法(Java版)快速学习(数组Array)

    Java数组 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型. 用类封装数组实现数据结构 数据结构必须具有以下基本功能: ①.如何插入一条新的数据项 ②.如何寻找某一特定 ...

  9. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  10. Java数据结构和算法(二)——数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

随机推荐

  1. 基于GPT搭建私有知识库聊天机器人(二)环境安装

    1.需要安装的包 pip3 install flask //python开发web框架 pip3 install langchain //LLM开发框架 pip3 install openai //L ...

  2. Go优雅的错误处理: 支持错误堆栈, 错误码, 错误链的工具库

    地址: https://github.com/morrisxyang/errors 如果觉得有用欢迎 Star 和 PR, 有问题请直接提issue errors 简单的支持错误堆栈, 错误码, 错误 ...

  3. 浅谈REFS文件系统数据恢复研发经历(1)

    作为80后技术员, 我一直很喜欢李玟, 是我们那个时代的偶像, 一直也很喜欢听他的歌, 看到她的噩耗, 还是很那么的无法理解, 一个那么好的人怎么会得抑郁症呢, 心里多少还是无法接受. 不过联想到自己 ...

  4. Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

    总结/朱季谦 最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行.删除行.动态表单验证.动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时, ...

  5. #Powerbi 10分钟,理解 Rankx 排名函数

    一:本文思维导图及示例数据图 1.1思维导图 1.2  示例数据图 二:度量值示例 2.1 函数简介 RANKX 首先为的每一行计值表达式,将结果临时存储为一个值列表.然后在当前筛选上下文中计值,将得 ...

  6. Linux安装与配置FTP服务

    1.FTP安装与配置 1.1.FTP安装 一般使用yum直接在线安装 # 在线安装FTP yum install -y vsftpd 安装完成后查看ftp状态 # 查看ftp状态 systemctl ...

  7. K8S | Deployment应用编排

    目录 一.背景 二.Deployment组件 1.简介 2.语法说明 三.基础用例 1.创建操作 2.查看信息 3.更新操作 4.删除操作 四.进阶用例 1.回滚操作 2.伸缩操作 3.暂停与恢复 五 ...

  8. 号外号外!首届开源 AI 游戏挑战赛圆满结束!

    北京时间 7 月 8 日到 7 月 10 日, 我们举办了 首届开源 AI 游戏开发挑战赛.这是一场激动人心的赛事活动,游戏开发者在紧迫的 48 小时内使用 AI 创造.创新有创意的游戏. 本次赛事活 ...

  9. JS优化技巧,解决冗余代码

    1. 使用箭头函数简化函数定义 // 传统函数定义 function add(a, b) { return a + b; } // 箭头函数简化 const add = (a, b) => a ...

  10. Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs

    目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明 Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改 Hi3798MV200 恩兔N2 NS ...