二分查找边界处理

251 阅读1分钟

二分的本质是二段性不是单调性。

image.png 当想找不满足性质的边界值(红色区域的右边界值)

image.png 找中间值 mid = (l+r+1)/2
if(check(mid))等于true或者是false
check(m)是检查m是在不满足性质的区间(检查是不是在红色区间)
更新l或者r

image.png

当想找满足性质的边界值(绿色区域的左边界值)

  1. 找中间值 mid = (l+r)/2
  2. if(check(mid))等于true或者是false
    check(m)是检查m是在满足性质的区间(检查是不是在绿色区间)
  3. 更新l或者r

归结上面的两种二分方法,步骤为:
先写一个check函数
判定在check的情况下(true和false的情况下),如何更新区间。

  • 移动l或者r
  • 移动后的边界能不能包含mid 在check(m)==true的分支下是:
    l=mid的情况,中间点的更新方式是m=(l+r+1)/2,r更新方式是 r = m - 1
    r=mid的情况,中间点的更新方式是m=(l+r)/2,l = mi + 1

    这种方法保证了:
  1. 最后的l==r
  2. 搜索到达的答案是闭区间的,即a[l]是满足check()条件的。

转自:www.acwing.com/solution/co…


算法练习: www.acwing.com/problem/con…