数组

本文详细探讨了数组这一基本数据结构,从定义、类型、内存分配到操作方法,全面解析数组的工作原理,并通过实例展示了数组在存储和检索大量数据时的效率。同时,讨论了数组与其他数据结构如链表的对比,以及在实际编程中如何选择和优化数组的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最简单的数据结构就是数组,是一个连续的内存块。它总是用来代表序列。给定一个数组A,A[i]表示数组中存储的第i+1个对象。获取和更新A[i]花费O(1)的时间。
插入一个已经满了的数组需要resizing,开辟一个新的带有额外空间的数组,把原来数组的元素拷贝过来。这会增加插入操作最坏情况的时间复杂度,但是如果新的数组有一个大于原来数组一个常数因子,平均的插入时间就会是常数,因为resizing并不频繁。
数组中删除一个元素需要把所有后面的元素向左移动一位,为了填补空下来的位置。从长度为n的数组中删除index为i的元素的时间复杂度为O(n-i)。

数组问题常常会有O(n)的空间复杂度的简单粗暴的解法,但是更精妙的解法就是运用数组本身减小空间复杂度到O(1)。
从前面填充一个数组是很慢的,所以要看是否可以从后面写入。
与其删除一个元素(需要移动所有它右边的元素),不如考虑覆盖它。
在处理一个被数组编码的整数时,可以考虑处理整数的位时从数组后面开始。或者,可以翻转数组,因此最低位变成了数组的第一个元素。
熟悉写关于子数组操作的代码。
操作数组时很容易犯off-by-1的错误。
直到函数返回之前,都不用担心维持数组的完整性(有序性,相等的元素放一起等等)。
当我们提前知道数组元素分布的时候,数组是一种很好的数据结构。
一个长度为W的布尔类型数组很适合去表示{0,1,...,W-1}的子数组。(当用一个布尔数组去表示{1,2,3...,n}的子数组时,开辟一个大小为n+1的数组来简化索引)。
当对一个2D数组进行操作时,对行和列运用并行的逻辑。
有的时候比起分析地求解结果,去模拟具体问题会更加简单。例如与其按旋转循序写出一个n*n矩阵的第i个元素的公式,不如从一开始就去计算输出。

数组相关问题:

1. 荷兰国旗问题:

2. 增长一个任意精度的整数:

3. 两个任意精度的整数相乘:

4. 向前跨越一个数组:

5. 从有序数组中去除重复元素:

6. 买卖一个货物一次:

7. 买卖一个货物两次:

8. 列出1到n之间的所有质数:

9. 对数组的元素进行排列:
排列是对一个序列的成员进行重新安排成为一个新的序列。例如数组{a, b, c, d}有24个排列。
一个排列可以用一个数组P来表示,其中P[i]表示索引为i的元素在排列中的位置。
例如排列{2, 0, 1, 3}表示把位置0映射到位置2,1映射到0, 2映射到1, 3映射到3,因此如果将一个排列{2, 0, 1, 3}应用于A = {a, b, c, d},得到的数组为{b, c, a, d}。
问题:给定一个n个元素的数组A和一个排列P,把P应用于A。
提示:任何一个排列都可以看做是一个循环排列的集合。对于循环中的一个元素,如何辨别它已经被排列过了?


10. 计算下一个排列:

11. 离线数据采样:

12. 在线数据采样:

13. 计算一个随机排列:

14. 计算一个随机子集:

15. 生成不均匀随机数字:

16. 数独检测问题:

17. 计算2D数组的旋转顺序:

18. 旋转2D数组:

19. 计算Pascal三角形的每一行:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值