Maximum Subsequence Score

MediumArrayGreedySortingHeap (Priority Queue)

Solution

import { Heap, range } from '@algorithm/lib';
 
export function maxScore(nums1: number[], nums2: number[], k: number): number {
  const n = nums1.length;
  const pairs = Array.from({ length: n }).map((_, i) => [nums1[i], nums2[i]]);
  pairs.sort((a, b) => b[1] - a[1]);
 
  const heap = new Heap<number>((a, b) => a - b);
  let sumValue = 0;
  for (const i of range(k)) {
    heap.push(pairs[i][0]);
    sumValue += pairs[i][0];
  }
 
  let answer = sumValue * pairs[k - 1][1];
 
  for (const i of range(k, n)) {
    sumValue -= heap.pop() || 0;
    sumValue += pairs[i][0];
    heap.push(pairs[i][0]);
 
    answer = Math.max(answer, sumValue * pairs[i][1]);
  }
 
  return answer;
}