欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二分查找及其变种

程序员文章站 2024-03-20 16:30:46
...

要点

  1. 每次查找范围一定要缩小,如果另mid = l 或 mid = r时,查找范围为长度为1时会陷入死循环。
  2. 如果写成 l < r , 当查找范围长度为1时,会导致找不到key。
  3. 写成mid = l + (r - l)/2,可防止整数溢出。
  4. 使用ans保存已经符合条件的最后的mid,最后返回即可。

查找符合条件的位置

int binary(int * arr, int val, int l, int r)
{
    if(arr == NULL || r < 0) return -1;
    int mid = 0;
    while(l <= r)
    {
        mid = l + (r - l)/2;
        if(arr[mid] == val)
        {
            return mid;
        }
        else if(arr[mid] > val)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }
    return -1;
}

查找符合要求的最小位置

int binary(int * arr, int val, int l, int r)
{
    if(arr == NULL || r < 0) return -1;
    int mid = 0;
    int ans = -1;
    while( l <= r )
    {
        mid = l + (r - l)/2;
        if(arr[mid] >= val)
        {
            ans = mid;
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }
    return ans;
}

查找符合要求的最大的位置

int binary(int * arr, int val, int l, int r)
{
    if(arr == NULL || r < 0) return -1;
    int mid = 0;
    int ans = -1;
    while(l <= r)
    {
        mid = l + (r - l)/2;
        if(arr[mid] <= val)
        {
            ans = mid;
            l = mid + 1;
        }
        else
        {
            r = mid - 1;
        }
    }
    return ans;
}