假设您有一个排序的整数数组:
{3,4,4,6,10,15,15,19,23,23,24,30}
并且你想找到 4 到 23 范围内的整数个数。
{4,4,6,10,15,15,19,23,23}
因此结果将是 9。
我编写了一个二进制搜索实现,但我不确定如何修改它以同时考虑到可以有多个整数与范围的上限匹配。
我想在方法签名中添加一个布尔值来询问是否查找密钥的上限,但我不确定是否可以在保持 O(log(N)) 复杂性的同时在单个方法中完成。
或者是否有其他方法可以在 O(log(N)) 时间内找到排序数组中该范围内的项目数?
这是我到目前为止所拥有的:
int start = rangeBinarySearch(arr, 4, false);
int end = rangeBinarySearch(arr, 23, true); // true would indicate that I want the position of the last occurrence of the key.
int totalInRange = (Math.abs(end) - Math.abs(start) -1)
private static int rangeBinarySearch(int[] items, int key, boolean lastIndex) {
if(items == null)
throw new IllegalArgumentException();
int start = 0;
int end = items.length - 1;
while(start <= end) {
int mIndex = (start + end) / 2;
int middle = items[mIndex];
if(middle < key)
start = (mIndex +1);
else if(middle > key)
end = (mIndex -1);
else
return mIndex; // Possible something here to find the upper bounds?
}
return -(start +1);
}