Insert Delete GetRandom O(1)

MediumArrayHash TableMathDesignRandomized

Solution

export class RandomizedSet {
  private readonly map: Map<number, number>;
  private readonly arr: Array<number>;
 
  constructor() {
    this.map = new Map();
    this.arr = [];
  }
 
  private swap(index1: number, index2: number) {
    const temp = this.arr[index1];
    this.arr[index1] = this.arr[index2];
    this.arr[index2] = temp;
  }
 
  public insert(val: number): boolean {
    if (this.map.has(val)) {
      return false;
    }
    this.map.set(val, this.arr.length);
    this.arr.push(val);
    return true;
  }
 
  public remove(val: number): boolean {
    const index = this.map.get(val);
    if (index === undefined) {
      return false;
    }
    this.swap(index, this.arr.length - 1);
    this.arr.pop();
    this.map.set(this.arr[index], index);
    this.map.delete(val);
    return true;
  }
 
  private getRandomIndex() {
    return Math.floor(Math.random() * this.arr.length);
  }
 
  public getRandom(): number {
    const randomIndex = this.getRandomIndex();
    return this.arr[randomIndex];
  }
}