二分探索
# 目次
二分探索は末端条件にバグを仕込まないように実装するのが重要.
もれなくすべての要素をチェックし、かつ無限ループに陥らないように.
# ポイント
left=0,right=v.size()-1を両端としてその中間点mid = (left+right) / 2を取る.midで領域を2分割する.leftからmidまでの左領域と、mid+1からrightまで右領域の2つ。- ``target
がv[mid]`より小さければ次は左領域を、大きければ右領域を探す. - すべての探索が終了すると
leftとrightが入れ替わるのでそれを終了条件とする.
# コード
inline bool search(vector<ll> v, ll target) {
if (target < v[0] || v[v.size()-1] < target) return false;
ll left = 0, right = v.size(), mid;
while (left < right) {
mid = (left + right) / 2;
if (v[mid] == target) return true;
else if (v[mid] < target) left = mid+1;
else right = mid;
}
return false;
}