|
|
|
|
|
by scuol
344 days ago
|
|
The way I always remember leftmost and rightmost binary search (the C++ equivalents-ish of lower_bound and upper_bound) is to always have a "prior best" and then move the bounds according to the algo while (l < r) { //find the midpoint auto mp = l + (l-r)/2; if (nums[mp] == target)
{
prior = target; #ifdef upper_bound l = target + 1; // move the left bound up, maybe there's more up there we can look for! #else //lower bound, we found the highest known instance of target, but let's look in the exclusive left half a bit more r = target - 1; #endif } excuse the terrible formatting, it's been a long day grinding leetcode after getting laid off... |
|
I have my rightmost code at part III of the miniseries, [1]. It loks quite similar, but I save the -1 for the very end return.
(It should technically be BEFORE, I guess. If it helps all rightmost bsearches are also leftmost bsearches on the reversed array, so AFTER is secretly not wrong)[1]: https://hiandrewquinn.github.io/til-site/posts/binary-search...