数组和链表的异同
相同点:两个都是线性的数据结构,是非常基础的数据结构,是后续高级数据结构的前提,例如树、图。
队列和堆栈是操作受限的线性数据结构,前者先进先出,后者先进后出。这两种数据结构的底层既可以是数组,也可以是链表。覃超老师推荐使用双端队列,deque。
不同点:
- 数组占据内存中连续的部分,而链表对内存要求没有那么严格。
- 数组能够随机访问任意一个位置,而链表则必须一个个遍历过去。
- 两种数据结构查找时间复杂度都是O(n),。如果数组是有序数组,那么通过二分查找,可以让查找变为O(log n).但是链表即便是有序链表也得挨个走过去。不过链表可以升维,有序的链表可以进化成跳表,也就是加多级索引,提高查找效率,这就是一种空间换时间的思想。
- 数组的插入和删除操作都是O(n)的时间复杂度,链表则是O(1)的时间复杂度。
本周刷题的时候,覃超老师介绍了五毒神掌,五遍刷题法。之前上过算法小课,刷过一次题目,现在再刷一次题目的时候,发现之前刷过的题目又陌生了,果断药不能停,刷题还需要继续。
此外,有一个理念非常重要,不懂的题目,要果断看答案,不要用太太太多时间思考,否则就会有很强的挫败感。这样子看来,之前的我还是太“憨厚”了,不想出来不看题解,导致时间浪费了,还没有收获(也不是没有,收获了挫败感)。现在觉得算法这个东西,就是听覃超老师的,多刷题才行,熟练度上去了,感觉就有了,后续才有自信心继续做下去,形成良性循环。
本周大部分数组和题目都用到了快慢指针的概念,
- 移动0的时候,就是用慢指针确定不为0的位置,快指针找到0的位置,
- 在去掉重复值,也是慢指针确定重复元素的位置,快指针移动到下一个不相同的元素,然后进行转换。
- 三数之和,用到了三个指针。第一个指针确定第一个元素,二三指针 则是在两侧向内移动
在链表的时候,有以下两个领悟
- 哑节点,作为头节点的前一个节点,确定了合并后链表的起始节点
- 链表合并后,如果其中一个元素提前结束,剩下的节点,只要用指针指过去即可
- 快慢指针是好东西,确定中间位置,确定是否有环,都用得到。