二分法,应该是所有算法里面最简单的,就是在一个有序数组中找一个数,非常简单。

但是最近捕捉到了一点细节,还是想用系统化的模型来总结总结。

二分法的基本用法:

(1)在一个无重有序数组中找一个确定的数,返回找到的下标

(2)在一个可重复的有序数组中找一个确定的数,返回这个数出现的第一个下标

(3)在一个可重复的有序数组中找一个确定的数,返回这个数出现的最后一个下标

(4)结合(2)(3)可得,在一个可重复的有序数组中找一个确定的数,返回这个数出现的所有下标

然而,很多题目的二分法是这么用的:

我总结了一下,基本二分法是在一个显式数组中找到一个​确定的数​,

而很多时候,我们是要求满足某种条件的最大的数,所以我们搜索的对象是​隐式的解空间数组​,搜索的目标就是​我们的答案​。

理解了这个差异,二分法的题目应该都能想到二分了。

搜索解空间数组的时间复杂度是O(T* logJ),其中T是单点验证时间,J是解空间的大小。

一般如果我们能在10^6次计算内完成单点验证,就不会超时。