**Jon Bentley:**90%以上的程序员无法正确无误的写出二分查找代码。
Jon Bentley:在贝尔实验室和IBM 的时候都出过这道考题。那些专业的程序员都认为自己写出了正确的程序。于是,我们花了半个钟头来用测试用例验证他们的代码。一百多人中有90%的程序员写的程序中有bug。
一个更惊人的事实是,二分查找算法的论文在1946年就发表了,但第一个没有错误的程序直到1962年才写出来。
直到今日,字节跳动等大公司的面试也经常考查二分查找。虽然二分查找的思路非常简单,就是通过不断通过有序数组的中间项与查找target 进行比较,可以排除数组一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到target,时间复杂度为logN。
思路看起来很简单,但是大厂多次考察的原因是什么呢?
面试者非常容易写错二分查找的边界条件,尤其对于二分查找变种题型。这篇文章教会你写边界条件的通用思考方式,适用所有变种题型,不需要死记硬背。学会之后,面试前再看一遍,保证顺利bug-free。
小伙伴们有兴趣想了解更多相关学习资料请点赞收藏+评论转发+关注我之后私信我,注意回复【000】即可获取更多免费资料!
01. 分治
二分法是分治(divide and conqer)的一种特例,本质上是为了将大问题分解成更小的问题,而二分法是恰好将问题规模减少为原来的一半。
我们拿到一道新题,第一想法不是想能不能用二分法解决,而是想能不能用分治法解决,将大问题拆解成子问题解决?如果整个问题是有序的,并且子问题恰好能将规模减少为原来的一半,思路就导向了二分法。
如果发现子问题是有冗余的,思路就导向了动态规划,详细见刷题有术--动态规划 必备知识二分法一些明显标志:有序数组;区间范围,单调性逼近。
02. 二分查找
二分查找也叫二分搜索,有递归和非递归两种写法。面试推荐非递归写法,因为方便确定边界条件写法