算法面试40讲3

初学者应该了解的数据结构: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:是很好的计数的数据结构

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值