二分查找练习解答
Posted 小小后端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找练习解答相关的知识,希望对你有一定的参考价值。
上一篇文章《二分查找》最后留了一个练习,这里给下我的解决办法。
在此之前,我先说下我之前代码的一点问题。当时,我是这样算中间位置的
mid = (left + right) / 2
其中,right >= left >= 0。
从数学层面看,这并没有问题。但是,计算机里的整型是有限大的。当数组长度比较大,极端情况下 left + right 的值可能会接近 right 的 2 倍,很有可能造成溢出。换用下面这种方式可以解决
mid = left + (right - left) / 2
多谢知识星球伙伴 @donng 指出这个问题。我的代码有的地方可能考虑并不完整,欢迎大家指正。
好了,回到本文,贴下之前的问题
在一个可能有重复元素的整形升序数组 arr 中,计算等于 target 的元素的个数。比如 arr = {1, 3, 3, 5, 7},当 target = 3 时,返回 2;当 target = 9 时返回 0。
解决方法如下,代码结构还算清晰,稍微看下就能理解思路,这里不再赘述。
int getLeftIndex(int* arr, int left, int right, int target)
{
int mid;
while (right - left > 1) {
mid = (left + right) / 2;
if (arr[mid] >= target) {
right = mid;
} else {
left = mid;
}
}
return right;
}
int getRightIndex(int* arr, int left, int right, int target)
{
int mid;
while (right - left > 1) {
mid = (left + right) / 2;
if (arr[mid] <= target) {
left = mid;
} else {
right = mid;
}
}
return left;
}
int solution(int* arr, int left, int right, int target)
{
int l = getLeftIndex(arr, left, right, target);
int r = getRightIndex(arr, left, right, target);
return (arr[l] == target && arr[r] == target)?
(r - l + 1) : 0;
}
以上是关于二分查找练习解答的主要内容,如果未能解决你的问题,请参考以下文章