LeetCode Q 1090 - Largest Values From Labels
We have a set of items: the i-th item has value values[i] and label labels[i].
Then, we choose a subset S of these items, such that:
- |S| <= num_wanted
 - For every label L, the number of items in S with label L is <= use_limit.
 - Return the largest possible sum of the subset S.
 
Example 1:Input: values = [5,4,3,2,1], labels = [1,1,2,2,3], num_wanted = 3, use_limit = 1 ; Output: 9
Explanation: The subset chosen is the first, third, and fifth item.
Example 2:Input: values = [5,4,3,2,1], labels = [1,3,3,3,2], num_wanted = 3, use_limit = 2 ; Output: 12
Explanation: The subset chosen is the first, second, and third item.
Example 3:Input: values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 1
Output: 16
Explanation: The subset chosen is the first and fourth item.
Example 4:Input: values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 2
Output: 24
Explanation: The subset chosen is the first, second, and fourth item.
Note:
- 1 <= values.length == labels.length <= 20000
 - 0 <= values[i], labels[i] <= 20000
 - 1 <= num_wanted, use_limit <= values.length
 
Solution
- Use an array 
pairto store thevalue - labelpairs; - Sort 
pairaccording tovalue; - Use an array 
countto store the number of labels we have used 
Code:
public int largestValsFromLabels(int[] values, int[] labels, int num_wanted, int use_limit) {
  
  if (values.length == 0) return 0;
  int len = values.length;
  int[][] pairs = new int[len][2];
  for (int i = 0; i < len; i++) {
    pairs[i][0] = values[i]; pairs[i][1] = labels[i];
  }
  Arrays.sort(pairs, (a, b) -> (b[0] - a[0]));
  int[] count = new int[20001];
  int totalNumber = 0, totalSum = 0;
  for (int i = 0; i < len; i++) {
    if (totalNumber == num_wanted) break;
    if (count[pairs[i][1]] == use_limit) continue;
    totalSum += pairs[i][0];
    count[pairs[i][1]]++;
    totalNumber++;
  }
  return totalSum;
}