描述
有时候我们用二分查找法找的不是一个元素而是一段区域。这时候我们就可以设计floor(地板)
和ceil(天花板)
函数,找到相应区域的起始位置和结束位置。
注意
-
当我们要找的元素target不在序列中时,令floor指向比target小的第一个元素,ceil指向比target大的第一个元素。
-
所以floor的取值要从[-1…n-1],ceil的取值为[0…n]。正因如此,所以在floor函数中找中间位置需要向上取整,而在ceil函数中需要向下取整。
实现代码
对所给数据进行二分直到l == r
,表示找到比target小的最大元素或比target大的最小元素的位置。具体实现如下:
#include<iostream>
using namespace std;
template<typename T>
int floor(T arr[], int n, T target) {
//floor可以取[-1...n-1]
int l = -1, r = n-1;
//找到比target小的第一个位置