第三章 数组
1-2 二分搜索
3-4 移动0,swap换位置
5 三路快排
6 对撞指针
7-8 最小/大子数组滑动窗口
第四章 查找表
1 用set找不重复交集
2 用map找可重复交集
3 用unordered_set和unordered_map实现,由于是哈希表时间复杂度会降低
4 两数和,将数组存入unordered_map,可以做查找
5 四数和,分别用二重循环遍历两个数组,将结果存入unordered_map,然后查找
6 回旋镖,这题要求是考虑顺序的,用循环算每个点之间的距离,将距离和频次存入unordered_map
7-8 滑窗和set/unordered_set结合
unordered_map和map
unordered_map存储机制是哈希表,,即unordered_map内部元素是无序的。
map是红黑树,map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。
unordered_set和set
unordered_set基于哈希表,是无序的。
set实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
第五章 链表
自己写链表结构
这章大部分都用了虚拟头节点
1-2 反转链表,要定义三个重要指针pre,cur,next
3 给头节点,删除特定值的节点,
删除节点,重点是设立虚拟头节点dummyhead,指向head,这样如果删除的是第一个节点不用再判断了,最后返回dummyhead->next,然后new出来的dummyhead要delete掉
4 交换节点,设4个指针,p,node1,node2,next,理清指针指向关系就好
5 只给了要删的node,无法知道他前面的指针,将node->next的值赋值给这个node然后删了node->next即可
6 给了头节点head和要删的倒数第n个节点,不知道链表一共几个节点,可以先遍历一遍看有几个节点再删,
更好的办法是用双指针,只需遍历一次
关于指针的new和不new的区别
下面是自己总结的一些关于new创建类对象特点:
new创建类对象需要指针接收,一处初始化,多处使用
new创建类对象使用完需delete销毁
new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
new对象指针用途广泛,比如作为函数返回值、函数参数等
频繁调用场合并不适合new,就像new申请和释放内存一样
https://blog.csdn.net/chen1083376511/article/details/60881771
第六章 栈和队列
1 有效括号,用栈后入先出的特性
2-3 二叉树前序遍历(根-左-右),用递归(深度优先),也可以用栈
4 二叉树层序遍历(广度优先),用队列先入先出特性
5 图的层序遍历也用队列
6 优先队列priority_queue默认从小到大排,取队头用 .top() ,而queue取队头用 .front() ,优先队列只允许你做出/入队操作
7 用优先队列维护前k大/小个元素,答案pq存成(频率,元素)就对,我存成(元素,频率)就不对,有点莫名其妙