这次可全都有了

1 什么是二分?

1.1 先讲个故事

有一天小明到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把小明拦下,要检查一下哪本书没有登记出借。小明正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆…… 最终,检测了 log2Nlog_2N 次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是小明背着剩下的书走了。 从此,图书馆丢了 N - 1 本书。

什么是二分?怎样用二分?

聪明的朋友可以发现,这就是二分的思想。不聪明请走左门前往小学二年级,和毕导重修 二分是什么?就把一堆东西分成两份,再取其中一份分成两份…… 最后找到要找的东西。

什么东西都可用二分吗? NONONO 用于查找的内容逻辑上来说是需要有序的 查找的数量只能是一个,而不是多个 (找区间的本质上是找左右边界,也是只有一个)

那二分怎么写呢?请见下文……

2 二分模板

2.0 写在前面

切记,只记住模板屁用不顶,忘了就完了!要理解!

2.1 二分查找

首先,先给出一个通用模板(我以前经常用的)


int l = 0, r = arr.size() - 1,;// arr为目标数组, target为查找目标
while(l<=r)
{
    int m = (r+l)/2;
    if (check(mid)) //check()为自定义的判断函数
        r = m;
    else 
        l = m + 1;
}
return L;

2.2 二分答案

上述模板适用于二分查找,但若是二分答案,则略有不同(二分查找和二分答案的区别文末讲解)

int l = Min, r = Max;// Min 为查询范围中最小值,Max为最大值

while(r - l <= 1e-7) // 1e-7可以等价替换为题中(如保留6位小数可以表达为1e-7)或自拟的最小差值
{
    int m = (r+l)/2;
    if (check(mid)) //check()为自定义的判断函数
        r = m;
    else 
        l = m + 1;
}
return L;

3 二分查找和答案的区别与用途

二分查找和二分答案本质上都是不断逼近正确答案。抽象一点,二分查询是这是在确定的位置里快速找东西,就是找答案;二分答案是这是在可能的范围里试答案,边试边检查,也就是猜答案

最后的最后,杜绝👁:“我懂了”, ✋ :"你懂个🔨"​的行为,编程重在实践,实践是检验真理的唯一标准

感谢观看,给个赞吧~💕

1 条评论

  • @ 2025-7-24 22:46:37

    好东西,不愧是(xuan)

    • 1