Snapshot Array

MediumArrayHash TableBinary SearchDesign

Solution

export class SnapshotArray {
  private id: number;
  private readonly snapshots: [number, number][][];
 
  constructor(length: number) {
    this.id = 0;
    this.snapshots = Array.from({ length }).map(() => [[0, 0]]);
  }
 
  public set(index: number, val: number): void {
    this.snapshots[index].push([this.id, val]);
  }
 
  public snap(): number {
    this.id += 1;
    return this.id - 1;
  }
 
  public get(index: number, snapId: number): number {
    const snaps = this.snapshots[index];
    const snapIndex = this.findSnapIndex(snaps, snapId);
    return snaps[snapIndex][1];
  }
 
  private findSnapIndex(snaps: [number, number][], snapId: number) {
    let [start, end] = [0, snaps.length];
    while (start < end) {
      const mid = Math.floor((start + end) / 2);
      if (snaps[mid][0] <= snapId) {
        start = mid + 1;
      } else {
        end = mid;
      }
    }
    return end - 1;
  }
}