二分

二分

我认为从二分找数入手十分合适。

首先有一单调序列,如1,3,7,11,15,67,105,156,248,356

下面要找到数字7在哪个位置。

很容易想到,可以直接暴力遍历每一个值,如果数的数量比较少,当然没问题,但是要是有一亿、十亿个数的话,显然时间复杂度为O(n),很容易TLE

但是二分就能很好地解决时间超限问题。因为它的时间复杂度为O(logn)
二分的原理也很简单,以上面的找数问题为例,先上代码:

#include<stdio.h>
int p[10] = {1, 3, 7, 11, 15, 67, 105, 156, 248, 356};//一个单调数组
int main()
{
    int l = 0, r = 9, mid;
    int m = 7;//待查找的数
    while (l <= r)
    {
        mid = (l + r) / 2;
        if (p[mid] > m)
            r = mid - 1;
        else if(p[mid]==m)
            break;
        else 
            l = mid + 1;
    }
    printf("所要查找的数在第%d个\n", mid+1);
    return 0;
}

代码思路:首先初始化l为左边界,r为右边界,然后进入循环,当满足l<r时退出循环。每次循环开始,mid赋值为左边界和右边界的中点,将p[mid]与所要查找的值m对比,若p[mid]<m,则将左边界l移动到mid+1的位置,否则将右边界r移动到mid-1的位置,如此循环。

参考博客

  1. 浅谈二分答案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hesorchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值