从已排序的数组中查找数字 X 的 floor 和 ceil。例如
a[] = {3, 7, 9, 10, 15}
- 如果 X=2,地板 = N/A,天花板 = 3
- 如果 X=3,地板 = 3,天花板 = 3
- 如果 X=4,地板 = 3,天花板 = 7
- 如果 X=16, floor = 15, ceil = N/A
我想我们大多数人都知道解决方案,即我们可以通过修改后的二进制搜索找到 floor/ceil。但是修改二分搜索的问题是我们需要处理很多边界条件。但我发现同样的二分搜索算法确实有效,但对于 floor 我们只需要写if low > high return low
和 ceilif low > high return high
。如果 floor 返回 -1,则显示 N/A,如果 ceil 返回的值大于数组索引,则显示 N/A。
地板算法:
int floorSearch(int a[], int low, int high, int x)
{
if(low > high){
return low;
}
int mid = (low+high)/2;
if(a[mid]>x){
return floorSearch(a, low, mid-1, x);
}
else if(a[mid]<x){
return floorSearch(a, mid+1, high, x);
}
else{
return mid;
}
}
对于 ceil:
int ceilSearch(int a[], int low, int high, int x)
{
if(low > high){
return high;
}
int mid = (low+high)/2;
if(a[mid]>x){
return ceilSearch(a, low, mid-1, x);
}
else if(a[mid]<x){
return ceilSearch(a, mid+1, high, x);
}
else{
return mid;
}
}
这很简单,不是吗?我检查了许多输入,它确实有效,但我未能证明算法的正确性。有人可以尝试证明它的正确性,或者您也可以提供该算法将失败的示例输入。谢谢。