二分查找练习解答

Posted 小小后端

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找练习解答相关的知识,希望对你有一定的参考价值。

上一篇文章《二分查找》最后留了一个练习,这里给下我的解决办法。

在此之前,我先说下我之前代码的一点问题。当时,我是这样算中间位置的

 
   
   
 
  1. mid = (left + right) / 2

其中,right >= left >= 0。

从数学层面看,这并没有问题。但是,计算机里的整型是有限大的。当数组长度比较大,极端情况下 left + right 的值可能会接近 right 的 2 倍,很有可能造成溢出。换用下面这种方式可以解决

 
   
   
 
  1. mid = left + (right - left) / 2

多谢知识星球伙伴 @donng 指出这个问题。我的代码有的地方可能考虑并不完整,欢迎大家指正。

好了,回到本文,贴下之前的问题

在一个可能有重复元素的整形升序数组 arr 中,计算等于 target 的元素的个数。比如 arr = {1, 3, 3, 5, 7},当 target = 3 时,返回 2;当 target = 9 时返回 0。

解决方法如下,代码结构还算清晰,稍微看下就能理解思路,这里不再赘述。

 
   
   
 
  1. int getLeftIndex(int* arr, int left, int right, int target)

  2. {

  3.    int mid;

  4.    while (right - left > 1) {

  5.        mid = (left + right) / 2;

  6.        if (arr[mid] >= target) {

  7.            right = mid;

  8.        } else {

  9.            left = mid;

  10.        }

  11.    }

  12.    return right;

  13. }

  14. int getRightIndex(int* arr, int left, int right, int target)

  15. {

  16.    int mid;

  17.    while (right - left > 1) {

  18.        mid = (left + right) / 2;

  19.        if (arr[mid] <= target) {

  20.            left = mid;

  21.        } else {

  22.            right = mid;

  23.        }

  24.    }

  25.    return left;

  26. }

  27. int solution(int* arr, int left, int right, int target)

  28. {

  29.    int l = getLeftIndex(arr, left, right, target);

  30.    int r = getRightIndex(arr, left, right, target);

  31.    return (arr[l] == target && arr[r] == target)?

  32.           (r - l + 1) : 0;

  33. }

以上是关于二分查找练习解答的主要内容,如果未能解决你的问题,请参考以下文章

二分查找(代码练习)

整数二分浮点二分代码模板

AK leetcode 流浪计划 - 二分查找

二分查找模板和详细练习题

二分查找模板和详细练习题

练习-二分查找