【数据结构】数组

发布于:2022-08-08 ⋅ 阅读:(328) ⋅ 点赞:(0)

看到数组,马上想到!

空间连续,类型相同

顾名思义,数组的特点就是空间连续,并且你类型不同也不能让你成为一个数组啊。


数组与链表的区别:

  1. 链表是链式存储,数组是顺序存储。
  2. 链表通过指针连接元素与元素,而数组则是把所有元素按顺序进行存储。
  3. 链表插入删除简单,容易实现长度扩充,但是查询元素比较困难;数组查询快,但是删除增加会比较麻烦。

这里着重说一下数组增删改查的效率问题:

  • 暂且认为,一切数组和链表的增删改查效率均为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对于这样的错误,表示的是没有指针的实体,也就是说,这个指针有可能是空的,不一定会成为返回值。


网站公告

今日签到

点亮在社区的每一天
去签到