二分算法
看了这个视频,感觉二分算法变得好理解多了
https://www.bilibili.com/video/BV1d54y1q7k7?from=search&seid=14378360076371462119
记录一下
朴素:
- 传统学的二分是将 带带查找的数与数组中的数作比较 分出两个部分,
-
再从两部分中选择一部分,再对比再次分成两个部分。。。。
难点在于边界的处理和针对不同的问题代码的细节问题
视频中的:
既然都是将数组分成你想要的两个部分,可以设置两个指针,指向的位置就是两个部分的边界位置。
int l=-1,r=n;//边界的指针
对于数组:
a:1 2 3 4 5 6 7
-
要查找3所在的位置 mid=(l+r)/2 = 3;
a[mid]=4>3 r=mid; -
mid=(l+r)/2=1;
a[mid]=2<3
l=mid; - mid=(l+r)/2=2;
a[mid]==3 找到
这个方法避免了边界问题的处理 模板: //)
简单来说看中间值属于哪个部分,然后将指针移动
针对极端情况l和r的值可能不变 需要在进行特判