一、数组简介
区别集合、列表和数组。
集合一般被定义为:有一个或多个确定的元素所构成的整体,即集合和就是一组失误组合在一起。特性:集合里的元素类型不一定相同,集合里面的元素是没有顺序的。集合一般不会直接作为数据结构出现在编程语言中,但是经过在集合的基础上添加一些规则就会形成我们常用的数据结构,如数组,链表,队列,栈,树,图等等。
列表(或者是线性列表)的定义为:一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。在编程语言中,列表最常见的形式有数组和链表,而栈和队列则是两种特殊的列表。
数组是列表的实现方式之一,在编程语言中应用是十分广泛的。区分数组和列表的重要概念:索引。
数组会用一些名为索引的数字来标识每项数据在数组的位置,而列表则是没有索引的。
二、数组的操作
读取元素:读取数组中元素,要用过索引的方式来读取,这里需要注意的是索引一般是从0开始的。数组,计算机在内存中为其申请一段连续的空间,并且会记下索引为0出的内存地址。由于计算内存地址的过程是很快速的,我们一旦世道了内存地址就可以立即访问到元素,所以读取元素的时间复杂度是O(1)。
查找元素:只需要从数组揩油逐步向后查找就可以。
插入元素:由于我们需要为插入的元素腾出位置,所以常常需要移动元素。
删除元素:与插入类似。
eg:寻找数组的中心索引
要求寻找一个下标,左侧所有元素相加等于右侧所有元素相加的和。
int pivotIndex(int* nums, int numsSize){
int left=0,right=0;
for(int i=0;i<numsSize;i++){
for(int j=0;j<i;j++)
left+=nums[j];
for(int k=i+1;k<numsSize;k++)
right+=nums[k];
if (left==right)
{
return i;
}
left=0;right=0;
}
return -1;
}
两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
解题思路:此题看似和求两个集合交集,但是我们需要注意集合(见上面)里面的元素是不能够重复的。但是题中的要求的是求两个数组的相同元素,可以相同。先对两个数组进行排序,然后类似于合并两个链表一样,从最小的元素开始相比。直至某个数组到达尾部。这里介绍一下c语言内置的一个排序函数qsort,比较函数fmin,fmax。
代码如下:
int cmp(const void* _a, const void* _b) {
int *a = _a, *b = (int*)_b;
return *a-*b;
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size,
int* returnSize) {
qsort(nums1, nums1Size, sizeof(int), cmp);
qsort(nums2, nums2Size, sizeof(int), cmp);
*returnSize = 0;
int* ans = (int*)malloc(sizeof(int) * fmin(nums1Size, nums2Size));
int index1 = 0, index2 = 0;
while (index1 < nums1Size && index2 < nums2Size) {
if (nums1[index1] < nums2[index2]) {
index1++;
} else if (nums1[index1] > nums2[index2]) {
index2++;
} else {
ans[(*returnSize)++] = nums1[index1];
index1++;
index2++;
}
}
return ans;
}