视频
0.如何有效学算法和数据结构
1.时间复杂度
时间复杂度就是代码执行的次数,有好几种复杂度时看最高复杂度的那个即可
2.数组和链表
数组:
链表:
链表插入
链表删除
双链表:可以前进也能后退
时间复杂度:插入/删除 O(1) ,查询 O(N)
习题:
判断链表是否有环:
3.栈(stack)和队列(queue)
合法括号:
a. 开头是左括号合法,压入栈
b. 遇到右括号出栈
c.最后栈是空的就合法
时间复杂度:O(N)
用栈实现队列:就是用两个栈
4.优先队列:按优先级出
了解机制,不用写
如最小堆,最小的永远在顶端
各种堆要记
找数据流中前k个最大值:
方法1:找k个最大值并排序
方法2(推荐):维护一个 size=k 的最小堆(优先队列)
滑动窗口最大值:
方法1:维护一个最大堆,size=窗口大小,该题维护优先队列方法速度慢
方法2(推荐):用双端队列(前后都能进出),擦除窗口中最大值左边比其小的数,保证窗口最右边是最大值
5.哈希表
set和map实现的两种方式(各有优缺点):
Hashmap/set 用哈希表存,查询复杂度O(1),但他是无序的
Treemap/set 用二叉树存,查询复杂度O(logN),是有序的
242有效的字母异位词
方法1:排序
方法2(推荐):用map统计字母出现次数
15三个数的和
推荐方法2和3
6.树
注意是左右子树所有节点跟根节点比,不是左右儿子
判断是否是搜索树
方法1:中序遍历,如果是搜索树会得到升序的序列
方法2:递归找左子树最大值和右子树最小值,如果 左子树最大值<根节点 且 右子树最小值>根节点 就是搜索树
7.递归和分治
递归基本模板:
a.终止条件
b.数据处理
c.调用自己
d.收尾工作(可能不需要)
分治就是将大问题分成小问题
8.贪心算法
122题待看
9.广度优先搜索