首先先说一点:二分查找法不仅仅可以用在有序数组里元素的查找上。如果是一个问题,待查找的数是整数,且知道范围,大概就可以通过逐步排查,缩小问题的规模的方式找到,这种算法也是二分查找算法。
我们平常写程序,定位问题其实通常也用的是这个思路。在适当的地方做一些代码输出,逐步缩小范围,最后找到了有 bug 的那一行或几行代码。
初学写二分查找的问题是:跳步厉害,写下 left = mid 或者 right = mid - 1 等代码的时候,一定要搞清楚是什么意思,必要的时候写上注释,帮助自己思考和以后复查代码。
本题解最重要的一句话:
把待搜索的目标值留在最后判断,在循环体内不断地把不符合题目要求的子区间排除掉,在退出循环以后,因为只剩下 1 个数没有看到,它要么是目标元素,要么不是目标元素,单独判断即可。
以前有个段子,我记得是奇志和大兵说的:说有个人去看病,他其实只是小感冒,医生让他把除了感冒的病症都检查一遍,什么心肝脾胃肾都让你做检查。这些病你都没有,那不就是得感冒了吗。虽然是个段子,但是这个思想是很朴素的。用在解二分法的问题上,会使得编码更加容易。
用这种思路写二分不容易出错,需要考虑的细节最少。熟悉之后,可以用于写所有的二分问题。而且这种思路也非常符合「二分」的名字,就是把「待搜索区间」分为「有目标元素的区间」和「不包含目标元素的区间」,排除掉「不包含目标元素的区间」的区间,剩下就是「有目标元素的区间」。
算法问题建议更多地理解思想,思考为什么这样写,而不建议背代码,背模板。即使要用代码和模板,例如并查集、线段树这种,也应该先把它们保存到自己的 github 代码仓库里,要用的时候去复制粘贴。
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。