Find the first True · F F F | T T T
int firstTrue(int n) {
int lo = 0, hi = n - 1; // valid range: the whole thing
int ans = -1; // sentinel: no True exists
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (pred(mid)) { // True → a smaller one may exist
ans = mid;
hi = mid - 1; // shrink right
} else { // False
lo = mid + 1; // go right
}
}
return ans;
}
Find the last True · T T T | F F F
int lastTrue(int n) {
int lo = 0, hi = n - 1; // valid range: the whole thing
int ans = -1; // sentinel: no True exists
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (pred(mid)) { // True → a bigger one may exist
ans = mid;
lo = mid + 1; // push right
} else { // False
hi = mid - 1; // go left
}
}
return ans;
}