Binary Search is a popular topic in coding assessments. However, there are tons of variations of binary search, and it is sometimes really confusing. Today, I want to clarify several variations of binary search and their underlying principles.
Closed interval vs Left closed right open interval
p.s. the code can be verified through LeetCode.
There are mainly two kinds of styles to implement binary search. Closed interval, i.e. [ l e , r i ] [le, ri] [le,ri] and left closed right open interval, i.e. [ l e , r i ) [le, ri) [le,ri).
For closed interval, a classic Python code of binary search is
def search(self, nums, target):
le = 0
ri = len(nums)-1
mid = 0
while le <= ri:
mid = (le+ri)//2
if nums[mid] == target:
return mid
if nums[mid] < target:
le = mid+1
else:
ri = mid-1
return -1
There are 3 possible cases regarding the relationship between middle value and target. If the middle value is equal to the target, we’ve found the target and it’s time to break the loop. If the middle value is less than target, the target must be in the right half of current interval. Since the interval is closed and the middle value should not be included in the interval, we set the le
to mid+1
to exclude middle value and just keep the right part. If the middle value is larger than target, the process is symmetric to less than and we will set ri
to mid-1
.
How about left closed right open version? Technically, this version just replaces the value of ri
with ri+1
. We can do some modification according to the new value.
For ri = len(nums)-1
, it should be rewritten to ri = len(nums)
. (obvious)
For le <= ri