Search in a Sorted Array of Unknown Size

medium binary search

Problem

Array is hidden behind reader.get(i); return index of target or -1. Out-of-bounds get returns 2^31-1.

Inputarr=[-1,0,3,5,9,12] target=9
Output4
First grow window exponentially, then binary search.

def search(reader, target):
    lo, hi = 0, 1
    while reader.get(hi) < target: lo = hi; hi *= 2
    while lo <= hi:
        m = (lo + hi) // 2; v = reader.get(m)
        if v == target: return m
        if v < target: lo = m + 1
        else: hi = m - 1
    return -1
function search(reader, target) {
  let lo = 0, hi = 1;
  while (reader.get(hi) < target) { lo = hi; hi *= 2; }
  while (lo <= hi) {
    const m = (lo + hi) >> 1; const v = reader.get(m);
    if (v === target) return m;
    if (v < target) lo = m + 1; else hi = m - 1;
  }
  return -1;
}
int search(ArrayReader reader, int target) {
    int lo = 0, hi = 1;
    while (reader.get(hi) < target) { lo = hi; hi *= 2; }
    while (lo <= hi) {
        int m = (lo + hi) / 2, v = reader.get(m);
        if (v == target) return m;
        if (v < target) lo = m + 1; else hi = m - 1;
    }
    return -1;
}
int search(const ArrayReader& reader, int target) {
    int lo = 0, hi = 1;
    while (reader.get(hi) < target) { lo = hi; hi *= 2; }
    while (lo <= hi) {
        int m = (lo + hi) / 2, v = reader.get(m);
        if (v == target) return m;
        if (v < target) lo = m + 1; else hi = m - 1;
    }
    return -1;
}
Time: O(log n) Space: O(1)