数据结构之数组
数据结构之数组
数组在内存中的存储方式:
数组占据一块连续的内存,并按照顺序存储数据。
数组常见操作
以下均为java语言描述
//指定大小创建一个数组 int n = 10; int[] nums = new int[n]; //带数据创建 int[] nums = new int[]{1,2,3}; //字符串转char数组 String s = "123"; char[] c = s.toCharArray();//则c为{'1','2','3'} //创建一个二维数组 int m = 3, n = 2; int[][] nums = new int[m][n];//创建一个m行n列的数组 //list转成数组 List<int[]> list = new ArrayList<int[]>(); return list.toArray(new int[list.size()][]); //对数组进行排序 int[] nums = new int[]{3, 5, 1, 4, 8, 7}; Arrays.sort(nums);//默认是升序排序, 排序之后得到 1,3, 4, 5, 7 ,8
数组的特点
-
时间复杂度O(1)
由于数组在内存中是连续的,可以根据下标在O(1)的时间复杂度内读/写任何元素. -
需要预先分配内存,空间效率不高
经常有空闲区域没有得到充分利用。
与数组相关的数据结构
哈希表
由于数组具有O(1)的时间复杂度,因此被用来设计hash表。数组下标设为hash表的key,把数组中的值设为hash表的值。构成“key-value”键值对。可以在O(1)的时间内实现查找。
ArrayList
由于数组空间效率不高,人们设计了动态数组。比如java中的ArrayList。
先为数组开辟较小的空间,然后往数组中添加数据。当数据的数据超过数组的容量时,再重新分配一块更大内存的空间,把之前的数据复制到新数组中,再把之前的内存释放掉。
缺点是每次扩容数组都有大量的额外操作,对时间性能有负面影响。因此使用动态数据要尽量减少改变数组容量大小的操作。
数组的一些常见题型
排序数组的查找
一般是考二分查找,双指针
数组中的重复数据
可以结合哈希表
对数组进行排序
一般是考各种排序算法
数组中第K大的数
也是考排序,比如第k大的数其实对应快排的k-1下标,因为快排找到k-1下标对应的值假设是m时,左边的数都是小于m的。m就是第k大的数。
二维数组的查找
主要是对二维数组的理解
这个是考位运算
这种类型就是综合题了,涉及面比较多,像归并排序,二分查找,或者分治也能做。所以基础还是要掌握的牢固一点再去思考变化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异