# 二分总结

二分

二分是每次查找中间值,再根据条件改变搜索区块的算法。
当问题的答案具有某种单调性时,可以用二分查找。
时间复杂度为O(log2n)

二分模板:

1(找第一个,一般用在最小值

int l = 1, r = n, mid;
while (l < r)
{
  mid = (l + r) / 2;//算出中点
  if (a[mid] >= x)
  {
    r = mid;//向左找
  }
  else
  {
    l = mid + 1;//向右找
  }
}
cout << l;

2(找最后一个, 一般用在最大值

int l = 1, r = n, mid;
while (l < r)
{
  mid = (l + r + 1) / 2;//算出中点
  if (a[mid] >= x)
  {
    r = mid - 1;//向左找
  }
  else
  {
    l = mid;//向右找
  }
}
cout << l;

做题时if里的条件可以改为check()来判断向左或向右

1 个赞

好水

1 个赞