二分查找
对于单调递增序列 a : \([1, 2, 3, 3, 3, 3, 4, 5, 6]\),若我要查找第一个 \(3\) 的下标和最后一个 \(3\) 的下标,可以使用二分查找,二分查找的时间复杂度为 \(O(log(n))\),假设有 \(2 ^ {100} = 1267650600228229401496703205376\) 的数据,我们最多只需要 \(100\) 次就能找到目标数据,几乎约等于常数时间复杂度。
二分查找左区间
对于单调递增序列 a : \([1, 2, 3, 3, 3, 3, 4, 5, 6]\),要查找 x 第一次出现的下标,定义一个左指针 l 右指针 r 和中间指针 mid,若 a[mid] < x 那么 l = mid + 1,这样使得左指针 l 过滤掉比目标值 x 还要小的数,l 会不断地向右靠近第一次出现的 x;若 a[mid] >= x 那么 r = mid ,这样会使得 r 过滤掉比 x 大的元素,也会不断地向左靠近最左边的 x。
二分查找左区间
二分查找右区间
对于单调递增序列 a : \([1, 2, 3, 3, 3, 3, 4, 5, 6]\),要查找 x 最后一次出现的下标,定义一个左指针 l 右指针 r 和中间指针 mid,若 a[mid] <= x 那么 l = mid,这样使得左指针 l 过滤掉比目标值 x 还要小的数,,也会不断地向右靠近最右边的 x;若 a[mid] > x 那么 r = mid - 1 ,这样会使得 r 过滤掉比 x 大的元素,r 会不断地向左靠近最右边的 x。