LeetCode每日一题(1090. Largest Values From Labels)

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

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
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值