Back to all solutions

#1090 - Largest Values From Labels

Problem Description

You are given n item's value and label as two integer arrays values and labels. You are also given two integers numWanted and useLimit.

Your task is to find a subset of items with the maximum sum of their values such that:

  • The number of items is at most numWanted.
  • The number of items with the same label is at most useLimit.

Return the maximum sum.

Solution

/**
 * @param {number[]} values
 * @param {number[]} labels
 * @param {number} numWanted
 * @param {number} useLimit
 * @return {number}
 */
var largestValsFromLabels = function(values, labels, numWanted, useLimit) {
  const items = values.map((value, index) => ({ value, label: labels[index] }));
  items.sort((a, b) => b.value - a.value);

  const labelCount = new Map();
  let result = 0;
  let itemsUsed = 0;

  for (const { value, label } of items) {
    const currentCount = labelCount.get(label) || 0;
    if (itemsUsed < numWanted && currentCount < useLimit) {
      result += value;
      labelCount.set(label, currentCount + 1);
      itemsUsed++;
    }
  }

  return result;
};