那必须祭出FB高级架构师爆肝3个月、增删16次的面试常考算法模板cheatsheetV4.1。
看前防杠:
本文仅对面试中的常考算法知识点给出通用解题思路和模板,代码量不算少,案例也算不上牛逼,但绝对经典,绝对通用!
本文作者:令狐冲,Facebook高级架构师,前算法竞赛中国国家集训队员,ACM金牌选手,面试常考算法模板献上:
学二分,让你不再精分
先给三道例题,试试能不能用二分法顺利解出答案。
⼆分查找(在排序的数据集上进行二分)
[在排序数组中找最接近的K个数]http://%29https//www.lintcode.com/problem/find-k-closest-elements/?utm_source=sc-csdn-ly0616)(在未排序的数据集上进行二分)
书籍复印(在答案集上进行二分)
如果没思路的话,接着往下看。
如果你是Java程序员,看这里:
强调几个要点:
①start+1<end
②start+(end-start)/2
③=,<,>分开讨论,mid不+1也不-1
④循环结束后,单独处理start和end
Python解法也为你整理好了,我是不是雨露均沾:
有人会说:模板背再多又如何,关键是不会用啊!
别慌,二分法的使用条件和时间复杂度在这里。
使用条件
-
排序数组(30-40%是二分)
-
当面试官要求你找一个比O(n)更小的时间复杂度算法的时候(99%)
-
找到数组中的一个分割位置,使得左半部分满足某个条件,右半部分不满足(100%)
-
找到一个最大/最小的值使得某个条件被满足(90%)
时间复杂度
时间复杂度:O(logn)
空间复杂度:O(1)
面试常考算法模板cheatsheet的用法
这是其中一个案例,在举一反三之前,我们来看看这套cheatsheet的用法:
面试前:
①先看例题,看自己是否能自行用相应的数据结构和算法解题。
②根据模板,解题。如有必要背诵模板。
③通过在LintCode上刷题,巩固其使用条件和时间复杂度
面试中:
①通过使用条件判断这道题用哪种解法
②套模板解题
当然,像是双指针、排序算法、二叉树、宽度优先搜索、深度优先搜索的使用条件、时间复杂度、代码模板,我也都整理好了。
关于算法面试,我还有想说的……
首先,看到这个问题的时候我愣了一下:代码量很少=牛逼吗?
我在Facebook当面试官时遇到过很多求职者,各个国籍都有。很多人觉得代码越短越好,实际上我认为通过适当的子函数化的代码包装,多加空行,虽然代码更长了,但是能够让你的代码:易读,易维护,不易错。
话又说回来,面试中追求的绝不仅仅是完美无瑕的代码,被录取的人也不全是ACM比赛前1%的大佬,面试官想要的一定是适合做partner,各方面能力都“刚刚好”的求职者。
这是我在《九章算法班》里反复强调的:
面试算法≠算法
现在我的春招公益讲座《FB面试官揭秘算法面试速成技巧 - 怎样做到 Bug Free 和刷100题等于别人刷300题》已经上线,感兴趣的小伙伴不妨一起来交流学习下~
所以,世界上哪有什么牛不牛逼呢?无非是有些人把某件事做到了极致,无非是有些人把某件事做到了“刚刚好”。
最后,奉上我整理的面试常考数据结构和算法的高频题,请安心食用~
深度优先搜索:
二叉树:
宽度优先搜索:
贪心:
二分法: