看到数组,马上想到!
空间连续,类型相同。
顾名思义,数组的特点就是空间连续,并且你类型不同也不能让你成为一个数组啊。
数组与链表的区别:
- 链表是链式存储,数组是顺序存储。
- 链表通过指针连接元素与元素,而数组则是把所有元素按顺序进行存储。
- 链表插入删除简单,容易实现长度扩充,但是查询元素比较困难;数组查询快,但是删除增加会比较麻烦。
这里着重说一下数组增删改查的效率问题:
- 暂且认为,一切数组和链表的增删改查效率均为O(n)。
- 无序数组的添加:O(1)。
- 有序数组的查找:O(logn),二分。
- 无序链表的添加:O(1)。
- 最后认为,剩余的情况,都是O(n)。
为什么数组删除还是O(n)呢?
要这样想,你不一定是一定删除最后一个吧?如果不是,就要考虑到其余元素向前移位的情况,那么就是O(n)了。
同理增加,你申请的空间已经固定了,那么你要增加的话,就得来一个更大的空间,来替换,所以还是复杂的。
数组按照索引查找,是O(1),但是按照内容,就变成了O(n)。所以说,根据数组下标,可以随机访问当前数组内的内容。
结论就是:数组针对下标索引搜索,效率就是O(1),如果是根据内容搜索,就是O(n)。
数组是线性结构,但也是重要的顺序结构。
数组和其他基础题目
数组中重复数字:【LeetCode】剑指 Offer 03. 数组中重复的数字_王向晚的博客-CSDN博客
哈希表的方法简单,但是下标交换的方法却是最好的,因为空间复杂度是O(1)。
数组中数字出现的次数:
数组全部元素都出现两次,只有一个出现一次:【LeetCode】136.只出现一次的数字_王向晚的博客-CSDN博客
数组全部元素都出现三次,只有一个出现一次//数组全部元素都出现两次,只有两个出现一次:【LeetCode】137/260. 只出现一次的数字 II/III_王向晚的博客-CSDN博客
2的幂判断:【LeetCode】231. 2的幂_王向晚的博客-CSDN博客
虽然是数组题,但是是对位运算的。
一个数字二进制里,1的个数:
右移操作,记录1的数量;右移就是/2,这种操作是比较快捷
与n-1向与,直到成为0为止。
类似于:【LeetCode】338. 比特位计数_王向晚的博客-CSDN博客
如何不用加减乘除,实现加法运算:【LeetCode】剑指 Offer 65. 不用加减乘除做加法_王向晚的博客-CSDN博客
两个数组前半部分递减,后半部分递增,如何找到最小值。
这个利用的是二分的思想,我们每次判断的是mid和mid-1、mid+1之间的关系,就可以判断出目前处于的是递减段,还是递增段,(low+high)>>1。
class Solution {
public:
int arrayMin(vector<int>vec) {
int n = vec.size();
int left = 0, right = n - 1, mid = 0;
while (left < right) {
mid = (left + right) >> 1;
if (vec[mid-1] > vec[mid] && vec[mid] < vec[mid+1]) {
return mid;
}
if (vec[mid-1] > vec[mid] && vec[mid] > vec[mid+1]) {
left = mid;
}
else {
right = mid;
}
}
}
};
使用分治法或二分法,使得效率变为logn,而不是原来的n。
类似的题:在排序数组中,查找数字:【LeetCode】剑指 Offer 53 - I. 在排序数组中查找数字 I_王向晚的博客-CSDN博客
runtime error: member access within null pointer of type对于这样的错误,表示的是没有指针的实体,也就是说,这个指针有可能是空的,不一定会成为返回值。