Skip to main content
2 of 2
added 2 characters in body
mdfst13
  • 22.4k
  • 6
  • 34
  • 70

First, I want to say thank you to everyone who offered their critiques and advice.

Not only did I learn a lot about binary search, I learned a lot about how to write better Python code.


def binary_search(keys, target, start = 0, end = None):
    end = end if end is not None else len(keys) - 1
    if end < start:
        return -1
    mp = start + (end - start) // 2
    if target == keys[mp]:
        return mp
    elif target < keys[mp]: 
        return binary_search(keys, target, start = start, end = mp - 1)
    else:
        return binary_search(keys, target, start = mp + 1, end = end)
    
def left_finder(keys, target, start = 0, end = None):
    end = end if end is not None else len(keys) - 1 
    if end < start: 
        return -1
    mp = start + (end - start) / /2
    if ((mp == 0 or keys[mp - 1] < target) and  keys[mp] == target):
        return mp
    elif target <= keys[mp]:
        return left_finder(keys, target, start = start, end = mp - 1)
    else:
        return left_finder(keys, target, start = mp + 1, end = end)

def right_finder(keys, target, start = 0, end = None):
    end = end if end is not None else len(keys) - 1 
    if end < start: 
        return -1 
    mp = start + (end-start) // 2
    if ((mp == len(keys) - 1 or target < keys[mp + 1]) and keys[mp] == target):
        return mp
    elif target < keys[mp]: 
        return right_finder(keys, target, start = start, end = mp - 1)
    else: 
        return right_finder(keys, target, start = mp + 1, end = end)

def duplicate_binary_search(keys, target):
    left, right = left_finder(keys, target), right_finder(keys, target)
    assert left <= right
    assert (left == -1) == (right == -1)
    return [] if left == -1 else list(range(left, right + 1))