首页 > 编程语言 >数据结构与算法 | 数组(Array)

数据结构与算法 | 数组(Array)

时间:2023-10-16 16:55:06浏览次数:39  
标签:nums 元素 索引 算法 数组 Array 数据结构 指针

数组(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来进行思考,前缀和就是典型一种示例。

标签:nums,元素,索引,算法,数组,Array,数据结构,指针
From: https://www.cnblogs.com/jzhlin/p/17767748.html

相关文章

  • 561、Array Partition
    Givenanarrayof2nintegers,yourtaskistogrouptheseintegersintonpairsofinteger,say(a1,b1),(a2,b2),...,(an,bn)whichmakessumofmin(ai,bi)forallifrom1tonaslargeaspossible.Input:[1,4,3,2]Output:4Explanation:nis2,a......
  • 基于X86六轮差速移动机器人运动控制器设计与实现(二)规划控制算法
    带输入约束的MPC路径跟踪控制MPC算法是一种基于控制对象模型的控制方法,其优势在于在控制中考虑了系统的多种物理约束,同时基于模型与当前机器人的反馈信息预估出未来机器人位姿信息的处理方法可以解决控制迟滞的问题。4.1MPC路径跟踪控制器框架根据第......
  • 分布式一致性算法Raft
    raft算法之所以容易理解,其一是他将一致性问题划分成几个子问题,这几个子问题都是独立、可理解和解释的。从传统的思维来讲,对于一个复杂的系统或者工程,都是大化小,分解实现,然后去尝试融合解决整体逻辑。一、Raft详解Raft算法是分布式系统开发首选的共识算法。比如现在流行Etcd、Con......
  • 数据结构之拓扑序列
    例题展示例题解决拓扑排序指的是从一个入度为0的点开始,将这个点记录下来,同时将这个点以及这个点的出度的线去除,再找入度为0的点,直到将所有的顶点遍历完成。故而,上述例题中的拓扑排序序列为01243567012436570214356702143657四种。......
  • 算法分析与设计大课程报告
    问题描述问题背景:输入法自动更正:当我们输入了一个不正确的词时,输入法就可能自动给我们更正。例如下面的例子: 图1提出问题:为什么输入法能够选到正确的那个词呢?我们的猜想是,可能输入法会找“长得像”的词作为他推荐给用户的,也就是更正的词。那么如何让计算机知道什么叫长得......
  • [算法分析与设计] 3. 并查集分析与反阿克曼函数
    Union-Find问题:给定\(n\)个元素,最初每个元素在一个集合中,有两种操作,union表示合并两个集合,find表示查询某个特定元素所在的集合。并查集是一种数据结构。其为每个集合寻找一个代表元,代表元可以是任意的,也可以随操作变化,但需要满足任何时刻一个集合的代表元是确定且唯一的。......
  • java和c#里的TOTP统一算法
    基础说明本文根据RFC4226和RFC6238文档,详细的介绍HOTP和TOTP算法的原理和实现。两步验证已经被广泛应用于各种互联网应用当中,用来提供安全性。对于如何使用两步验证,大家并不陌生,无非是开启两步验证,然后出现一个二维码,使用支持两步验证的移动应用比如GoogleAuthenticat......
  • 树叶识别系统python+Django网页界面+TensorFlow+算法模型+数据集+图像识别分类
    一、介绍树叶识别系统。使用Python作为主要编程语言开发,通过收集常见的6中树叶('广玉兰','杜鹃','梧桐','樟叶','芭蕉','银杏')图片作为数据集,然后使用TensorFlow搭建ResNet50算法网络模型,通过对数据集进行处理后进行模型迭代训练,得到一个识别精度较高的H5模型文件。并基于Dja......
  • 折半(二分)查找算法—高效搜索算法
    折半查找算法(BinarySearchAlgorithm)是一种高效的搜索算法,常用于已排序的数组或列表中进行查找操作。它的核心思想是通过比较中间元素与目标值的大小关系来确定目标值在数组的哪一部分,从而缩小搜索范围。本文将详细介绍折半查找算法的原理、实现以及应用场景。一、原理折半查找算......
  • [算法学习笔记] ST表
    学习时间:2023/10/15CSP-S2023倒计时5days我竟然才会ST表简述ST表主要用于解决静态RMQ问题。实际上,凡是具备可重复贡献和结合律的问题,都可以用ST表来解决。ST表的优化方式和前缀和差分类似,采取预处理,每次可以做到\(O(1)\)时间复杂度的查询。因此,它适用于有大量查......