初学者应该了解的数据结构:Array、HashMap 与 List
https://juejin.im/post/5b3731b36fb9a00e5326f087
十三、哈希表
映射(MAP)和集合(set)
哈希函数和哈希表
在数组中查找元素的时间复杂度是 O(n)
参考:https://juejin.im/post/5b3731b36fb9a00e5326f087
对于哈希碰撞,用链表来解决,叫拉链法
list、map、和set是一种解释性的数据结构,实现有很多种
list 想象为链,实现可以是数组和链表
map 映射:key -value
set 集合:可以用树和哈希来实现
前者查询:o(1),后者log(n)时间复杂度
后者是有序的,前者是乱序的
速度快的话,有哈希表,要求有序的话,用二叉树
十四、有效的字母异位词
lettcode:242
解法:
1、sort:string->sorted
o(n(log(n))
2、Map计数
{letter:count}
o(n.1)
python 里面的dict是用哈希表实现的
上面的解法是用系统自带的dict,下面的是用数组,实现最朴素的哈希表
十五、两数之和
1、暴力:[x,y] x+y=9
o(n*n)
2、set: x+y=9->y=9-x
for x:0:len
set 9-x
o(n)
十六、三数之和
1、暴力求解
o(n*n*n)
2、
map和set一般就是用来做查询和计数
3、两边向中间夹
a+b+c>0 动c
a+b+c<0 动b
o(n*n)
与第二个相比,不需要set,再开一个空间,所以空间节约了
17、理论讲解:树&二叉树&二叉搜索树
链表到树的发展:
完全二叉树(没有单个孩子)
next节点再指回去:图 :
总结:
Linked List (链表)就是特殊化的Tree
Tree 就是特殊化的Graph
常用语言实现二叉树:
没有特点的二叉树,用的很少,一般都是用二叉搜素树的衍生物:
平衡二叉搜索树,红黑树等
红黑树+三个平衡二叉搜索树
注意是左子树和右子树
二叉搜素树的复杂度:log(n)
c++和java里面的二叉搜素树是用红黑树实现的?
18、验证二叉搜索树(BST)
1、进行中序遍历-升序数组 o(n)
2、递归:validate(...,min.max) o(n)
19、二叉树&二叉搜索树的最近公共祖先
1、path(路径):父亲指针 o(n)
2、递归
如果P、Q=根节点,则返回P、Q
如果P和Q在左子树,则右子树返回是空,下面只需要继续在左子树中找
如果P和Q都不在左子树,左子树返回是空,则继续在右子树中查找
可以使用非递归的写法:
20、二叉树遍历
二叉搜索树的中序遍历,是有序的数组
21、递归和分治
if n<=1: return 1 是递归的终止条件
分治:
22、面试题:pow(x,n)
1、调用函数哦o(1)
2、暴力:o(n)
3、分治的思想:
分治的思想:
非递归:
&:是位运算
>>:右边移
23、求众数
map:是很好的计数的数据结构