Find in Mountain Array

HardArrayBinary SearchInteractive

Solution

export class MountainArray {
  private readonly arr: number[];
 
  constructor(arr: number[]) {
    this.arr = arr;
  }
 
  get(index: number): number {
    return this.arr[index];
  }
 
  length(): number {
    return this.arr.length;
  }
}
 
export function findInMountainArray(target: number, mountainArr: MountainArray) {
  const length = mountainArr.length();
 
  let peakIndex = 0;
  let [start, end] = [0, length];
  while (start < end) {
    const mid = Math.floor((start + end) / 2);
    if (mountainArr.get(mid) < mountainArr.get(mid + 1)) {
      start = mid + 1;
      peakIndex = mid + 1;
    } else {
      end = mid;
    }
  }
 
  [start, end] = [0, peakIndex - 1];
  while (start <= end) {
    const mid = Math.floor((start + end) / 2);
    if (mountainArr.get(mid) === target) {
      return mid;
    } else if (mountainArr.get(mid) < target) {
      start = mid + 1;
    } else {
      end = mid - 1;
    }
  }
 
  [start, end] = [peakIndex, length - 1];
  while (start <= end) {
    const mid = Math.floor((start + end) / 2);
    if (mountainArr.get(mid) === target) {
      return mid;
    } else if (mountainArr.get(mid) > target) {
      start = mid + 1;
    } else {
      end = mid - 1;
    }
  }
 
  return -1;
}