二分探索
# 目次
二分探索は末端条件にバグを仕込まないように実装するのが重要.
もれなくすべての要素をチェックし、かつ無限ループに陥らないように.
# ポイント
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;
}