Find the Longest Valid Obstacle Course at Each Position

HardArrayBinary SearchBinary Indexed Tree

Solution

export function longestObstacleCourseAtEachPosition(obstacles: number[]): number[] {
  const upperBound = (arr: number[], num: number) => {
    let [start, end] = [0, arr.length];
 
    while (start < end) {
      const mid = Math.floor((start + end) / 2);
      if (arr[mid] <= num) {
        start = mid + 1;
      } else {
        end = mid;
      }
    }
 
    return end;
  };
 
  const n = obstacles.length;
  const answer: number[] = new Array(n).fill(1);
  const arr: number[] = [];
 
  obstacles.forEach((height, i) => {
    const target = upperBound(arr, height);
    if (target === arr.length) {
      arr.push(height);
    } else {
      arr[target] = height;
    }
    answer[i] = target + 1;
  });
 
  return answer;
}