数据结构之数组

数据结构之数组

数组在内存中的存储方式:

数组占据一块连续的内存,并按照顺序存储数据。

数组常见操作

以下均为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

数组的特点

  1. 时间复杂度O(1)
    由于数组在内存中是连续的,可以根据下标在O(1)的时间复杂度内读/写任何元素.

  2. 需要预先分配内存,空间效率不高
    经常有空闲区域没有得到充分利用。

与数组相关的数据结构

哈希表
由于数组具有O(1)的时间复杂度,因此被用来设计hash表。数组下标设为hash表的key,把数组中的值设为hash表的值。构成“key-value”键值对。可以在O(1)的时间内实现查找。

ArrayList
由于数组空间效率不高,人们设计了动态数组。比如java中的ArrayList。
先为数组开辟较小的空间,然后往数组中添加数据。当数据的数据超过数组的容量时,再重新分配一块更大内存的空间,把之前的数据复制到新数组中,再把之前的内存释放掉。
缺点是每次扩容数组都有大量的额外操作,对时间性能有负面影响。因此使用动态数据要尽量减少改变数组容量大小的操作。

数组的一些常见题型

排序数组的查找

一般是考二分查找,双指针

数组中的重复数据

可以结合哈希表

对数组进行排序

一般是考各种排序算法

数组中第K大的数

也是考排序,比如第k大的数其实对应快排的k-1下标,因为快排找到k-1下标对应的值假设是m时,左边的数都是小于m的。m就是第k大的数。

二维数组的查找

主要是对二维数组的理解

剑指 Offer 39. 数组中出现次数超过一半的数字

这个是考位运算

剑指 Offer 51. 数组中的逆序对

这种类型就是综合题了,涉及面比较多,像归并排序,二分查找,或者分治也能做。所以基础还是要掌握的牢固一点再去思考变化。

posted @   cfdroid  阅读(151)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示

目录导航