我有一个已排序的整数数组。给定一个数字,即使是最坏的情况,如何在O(logn)中找到该数字的出现次数。
答案 0 :(得分:4)
对左边的所有元素都小于你的数字并且右边的所有元素都相等或更大的点进行一次二分搜索,并且对于所有元素小于或等于左边的点以及右边的更大的点进行一次二分搜索。
换句话说:在一次搜索中,您的“测试”为<
,而在另一次搜索中,测试为<=
。
两次搜索均为log n
,因此这是您的总数。
例如,在C ++中,您需要的两个函数是std::lower_bound
和std::upper_bound
- 看起来现有的Java二进制搜索函数(在集合上)总是试图寻找特定的值,所以你可能必须自己实施搜索,如果你正在使用它。
使用仅使用二元谓词的二进制搜索变体非常重要!如果你使用一个变体来检查它是否“偶然”击中一个特定的键,有时会很快终止这个特定的任务。
答案 1 :(得分:3)
二进制搜索数字,然后二进制搜索运行的开始和结束。
答案 2 :(得分:1)
使用两个二进制搜索搜索number + 0.5
和number - 0.5
的插入点。列表中值为number
的元素数量是这两个插入点的位置(索引)的差异。
答案 3 :(得分:0)
按原样运行下面的函数,并将if条件更改为if(a [mid]&lt; = val)并在递归调用中进行相应更改。返回的两个值是特定值的开始和结束出现。
int binmin(int a[], int start, int end,int val )
{
if(start<end)
{
int mid = (start+end)/2;
if(a[mid]>=val)
{
binmin(a,start,mid-1,val);
}
else if(a[mid]<val)
{
binmin(a,mid+1,end,val);
}
}
else if(start>end)
return start;
}