There is a set of n items. You are given two integer arrays values and labels where the value and the label of the ith element are values[i] and labels[i] respectively. You are also given two integers numWanted and useLimit.
Choose a subset s of the n elements such that:
The size of the subset s is less than or equal to numWanted.
There are at most useLimit items with the same label in s.
The score of a subset is the sum of the values in the subset.
Return the maximum score of a subset s.
Example 1:
Input: values = [5,4,3,2,1], labels = [1,1,2,2,3], numWanted = 3, useLimit = 1
Output: 9
Explanation: The subset chosen is the first, third, and fifth items.
Example 2:
Input: values = [5,4,3,2,1], labels = [1,3,3,3,2], numWanted = 3, useLimit = 2
Output: 12
Explanation: The subset chosen is the first, second, and third items.
Example 3:
Input: values = [9,8,8,7,6], labels = [0,0,0,1,1], numWanted = 3, useLimit = 1
Output: 16
Explanation: The subset chosen is the first and fourth items.
Constraints:
- n == values.length == labels.length
- 1 <= n <= 2 * 104
- 0 <= values[i], labels[i] <= 2 * 104
- 1 <= numWanted, useLimit <= n
按 value 进行排序, 从大到小依次查看是不是可以纳入到答案中来, 同时维护一个 labels 的计数和一个整体纳入答案的元素数量
use std::collections::HashMap;
impl Solution {
pub fn largest_vals_from_labels(values: Vec<i32>, labels: Vec<i32>, num_wanted: i32, use_limit: i32) -> i32 {
let mut values: Vec<(i32, i32)> = values.into_iter().zip(labels).collect();
values.sort_by_key(|(v, _)| -*v);
let mut ans = 0;
let mut counts = HashMap::new();
let mut num = 0;
for (val, lab) in values {
if num == num_wanted {
break;
}
let cnt = counts.entry(lab).or_insert(0);
if *cnt == use_limit {
continue;
}
*cnt += 1;
ans += val;
num += 1;
}
ans
}
}

根据values和labels数组,以及numWanted和useLimit参数,选择一个子集,使得子集大小不超过numWanted,且同一标签的元素数量不超过useLimit,返回子集的最大分数。文章提供了解题思路和示例解释。
1597

被折叠的 条评论
为什么被折叠?



