数组
一种线性结构,将相同元素存储在连续的内存空间中,元素在数组中的位置称之为索引,即数组下标。
1. 初始化数组
i:不给定初始值,如:int arr[5] //存储在栈上,无需手动释放
int* arr1=new int[5]//存储在堆上,需要手动释放
ii: 给定初始值, int arr[5]={1,2,,3,4,5}//存储在栈上,无需手动释放
int* arr1=new int[5] {1,2,3,4,5};//存储在堆上,需要手动释放
2.访问元素
给定数组元素的地址(首元素的地址)和某个元素的索引,可通过下式计算该元素的内存地址,从而直接访问该元素。
注意:索引本质上是内存地址的偏移量。首元素的索引是0,即首元素的地址偏移量为0。
数组访问元素的时间复杂度是O(1)。
3. 插入元素
因为数组元素是连续存储的,所以要想在数组中间某个位置插入元素,必须把该位置的元素以后的所有数据都往后移动一位(其实就是从后往前的复制)。再用索引的方式为该位置的元素赋值。
void insert(int*nums, int size, int num, int index){
//nums是数组,size数组长度,num是待插入的数值,index是插入的位置
for(int i=size-1; i>index; i--){
nums[i]=nums[i-1];
}
nums[index] =num;//插入目标元素
}
4. 删除元素
删除索引i处的元素,需要把索引i之后的元素都向前移动一位(其实就是从i处往后不断复制),注意:删除一个元素后,最后一个元素会变得”无意义“,无需特意修改它。
void del(int *nums, int size, int index){
//删除index位置的元素
for(int i=index; i<size-1; i++){
nums[i]=nums[i+1];
}
}
插入和删除数组元素的时间复杂度是O(n), 插入元素会使得超出数组范围的元素丢失
5. 遍历数组
可以通过索引(0~size-1)遍历数组。
6. 查找元素
查找元素可以通过遍历,一一判断元素是否匹配,若匹配则输出对应的索引值。
int find( int* nums, int size, int target){
for(int i=0; i<size; i++){
if(nums[i]==target){
return i;//返回找到的索引值。
}
}
return -1;//没找到
}
7. 扩容数组
大多数编程语言中,数组的长度是不可变的。
如需要扩容数组,则需要建立一个新的更大的数组,然后把元素一一复制到新数组中。时间复杂度O(n)。数组很大时,耗时长。
int* extend(int* nums, int size, int enlarge){
//初始化一个扩展enlarge的数组
int *ans =new int[size+enlarge];
for(int i=0;i<size; i++){
ans[i]=nums[i];//将元素一一复制
}
//记得释放原数组的内存
delete[] nums;
return ans;//返回扩展后的数组,(记得返回数组,本质上是返回首元素的地址)
}
声明:本人所写内容全部参考hello-algo,仅用于个人复习。