二分查找
二分查找查找key最左和最右的位置
利用这个特点,可以在O(log n)时间 在排序的数组中,统计一个数出现的次数。如[1,2,2,3],2出现了两次
//most_left_or_right: true 表示最左, false表示最右
int binary_search_most_left_or_right(int* array, int size, int key, bool most_left_or_right = true)
{
int low = 0;
int high = size - 1;
while(low <= high) {
int mid = (low + high) / 2;
if( array[mid] > key) {
high = mid - 1;
}
else if( array[mid] < key) {
low = mid + 1;
}
else {
if(most_left_or_right == true) {//查找最左
if( low == mid)
return mid;
high = mid;
}
else { //查找最右
if( high == mid)
return mid;
low = mid;
}
}
}
return -1;
}
浙公网安备 33010602011771号