二分模板
二分模板一共有兩個,分別適用於不同情況
演算法思路:假設目標值在閉區間$[L,R]$中,每次將區間長度縮小一半,當$L = R$時,我們就找到了目標值
版本1
當區間$[L,R]$的更新操作是$r = mid; l = mid + 1$
這種方式使得中點$mid$屬於左半區間,則左半區間是$[L, mid]$,右半區間是$[mid + 1, R]$
int binary(int l, int r) { while (l < r) { int mid = l + ((r - l) >> 1); if (check(mid)) r = mid; // 左 else l = mid + 1; // 右 } return l; }
版本2
當區間$[L,R]$的更新操作是$r = mid - 1; l = mid$時
這種方式使得中點$mid$屬於右半區間,則左半區間是$[L,mid - 1]$,右半區間是$[mid,R]$
int binary(int l, int r) { while (l < r) { int mid = l + ((r - l) >> 1) + 1; if (check()) r = mid; // 左 else l = mid + 1; // 右 } }