[算法]—二分查找

int类型的二分查找

基本思想:二分查找的基本思想是每次查找缩小查找范围的一半

int LowerBound(int a[], int target, int left, int right)
{
    while(right >= left)
    {
        int mid = left + (right - left) / 2;//防止left + right导致上溢
        if(a[mid] > target) right = mid - 1;
        else if(a[mid] < target) left = mid + 1;
        else if(a[mid] == target) return mid;
    }
    return -1;
}

为了防止 left + right发生上溢,可换为 left + (right - left) / 2

例题 想找出元素所在数组位置

#include <stdio.h>

int LowerBound(int a[], int target, int left, int right)
{
    while(right >= left)
    {
        int mid = left + (right - left) / 2;//防止left + right导致上溢
        if(a[mid] > target) right = mid - 1;
        else if(a[mid] < target) left = mid + 1;
        else if(a[mid] == target) return mid;
    }
    return -1;
}
int main(void)
{
    int a[105] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int ans;
    ans = LowerBound(a, 11, 0, 9);
    if(ans >= 0) printf("%d", ans);
    else printf("NO");
    return 0;
}

double类型二分查找

与int类型类似,唯一不同的是double类型为
while(right - left > 0.0000001)
例题 tz大佬的函数

题目背景

tz大佬从遥远的喜马拉雅山挖出了一个NN阶的函数,为了研究这个神奇的函数,tzdalao把函数拉到了编程俱乐部。

输入格式

第一行,一个正整数N和两个实数ll、rr,表示闭区间范围。

第二行,N+1N+1个实数,从左到右依次表示函数的系数。

输出格式

输出x的值,四舍五入保留5位小数。

样例输入

3 -0.9981 0.5
1 -3 -3 1

样例输出

-0.41421

说明

上述样例n = 3, x3 - 3x2 - 3x + 1

解题思路:讲函数求导后的系数存入数组,用二分法找出一节导数为0的点
AC代码

include <stdio.h>
#include <math.h>

double a[100] = {0}, n, ans1, mid;
double y(double x)//判断一阶导数的大小
{
    double j = n-1, ans = 0;
    for(int i = 0 ; i < n && j >= 0; i++, j--)
    {
        ans += a[i]*pow(x, j);
    }
    return ans;//返回一阶导数的值
}
int main(void)
{
    double temp;
    double l, r;
    scanf("%lf%lf%lf", &n, &l, &r);
    temp = n;
    for(int i = 0; i <= n; i++)
    {
        scanf("%lf", &a[i]);
        a[i] = a[i]*temp;//求一阶导数的系数
        temp -= 1;
    }
    while(r - l > 0.0000001)。。二分查找
    {
        mid = (r+l)*1.0/2;
        if(y(mid) > 0) l = mid;
        else  r = mid;
    }
    printf("%.5lf", mid);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值