数组理论基础
数组是存放在连续内存空间上的相同类型数据的集合。
- 数组下标都是从0开始的;
- 数组内存空间的地址是连续的;
- 数组的元素是不能删的,只能覆盖。
数组的经典题目
二分法
坚持循环不变量原则,只有在循环中坚持对区间的定义,才能清楚的把握循环中的各种细节。
条件:有序数组且无重复元素
双指针法
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新新数组下标的位置
滑动窗口
根据当前子序列和大小的情况,不断调节子序列的起始位置。
螺旋矩阵
循环不变量,找好边界。
前缀和
思考
看了上述总结,感觉最小覆盖子串、有序数组的平方一点印象都没有= =,希望灿灿老师可以讲解讲解
✪ ω ✪
链表
1、概念:
链表是一种通过指针串联在一起的线性结构,每一个节点由数据域和指针域组成,指针域用于存放指向下一个节点的指针,最后一个节点指针域指向null(空指针),链表入口节点称为链表的头结点(head)。
2、类型:
- 单链表(如上图)
- 双链表(每个节点具有两个指针域,一个指向上一个一个指向下一个节点,既可向前查询也可向后查询)。
- 循环链表(首尾相连,可用于解决约瑟夫环问题)。
3、链表的存储方式
- 数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。
- 链表是通过指针域的指针链接在内存中各个节点。
散乱分布在内存中的某地址中,分配机制取决于操作系统的内存管理。
4、链表的定义(WoW)
// 单链表
struct ListNode {
int val; // 节点上存储的元素
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数
};
5、链表的操作
1. 删除节点
删除D节点,如图所示,只要将C节点的next指针 指向E节点就可以了,c++中要动手释放D节点内存空间。
2. 添加节点
如图所示,可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作。
6、性能分析
- 数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。
- 链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。