LeetCode刷题

第三章  数组

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存成(频率,元素)就对,我存成(元素,频率)就不对,有点莫名其妙

第七章 二叉树和递归

你可能感兴趣的:(C++)