LeetCode 1090. 受标签影响的最大值(优先队列)

本文提供了一种解决力扣题目“最大标签价值子集”的算法思路,通过使用优先队列来实现对特定标签下价值最大的元素进行选择,确保在限定条件下获得子集的最大价值和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目

我们有一个项的集合,其中第 i 项的值为 values[i],标签为 labels[i]。

我们从这些项中选出一个子集 S,这样一来:

  • |S| <= num_wanted
  • 对于任意的标签 L,子集 S 中标签为 L 的项的数目总满足 <= use_limit。

返回子集 S 的最大可能的 和。

示例 1:
输入:values = [5,4,3,2,1], labels = [1,1,2,2,3], 
num_wanted = 3, use_limit = 1
输出:9
解释:选出的子集是第一项,第三项和第五项。

示例 2:
输入:values = [5,4,3,2,1], labels = [1,3,3,3,2], 
num_wanted = 3, use_limit = 2
输出:12
解释:选出的子集是第一项,第二项和第三项。

示例 3:
输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], 
num_wanted = 3, use_limit = 1
输出:16
解释:选出的子集是第一项和第四项。

示例 4:
输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], 
num_wanted = 3, use_limit = 2
输出:24
解释:选出的子集是第一项,第二项和第四项。
 
提示:
1 <= values.length == labels.length <= 20000
0 <= values[i], labels[i] <= 20000
1 <= num_wanted, use_limit <= values.length

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-values-from-labels
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 数据按标签分入各自的优先队列中
  • 每个优先队列取出前面最大的 use_limit 个到一个大的优先队列 q 中
  • 把 q 中的前 num_wanted 个取出来求和就是答案
class Solution {
public:
    int largestValsFromLabels(vector<int>& values, vector<int>& labels, int num_wanted, int use_limit) {
    	vector<priority_queue<int>> countUse(20001);//
    	for(int i = 0; i < values.size(); ++i)
    		countUse[labels[i]].push(values[i]);
    	int k, sum = 0;
    	priority_queue<int> q;
    	for(int i = 0; i <= 20000; ++i)
    	{
    		k = use_limit;
    		while(k-- && !countUse[i].empty())
    		{
    			q.push(countUse[i].top());
    			countUse[i].pop();
    		}
    	}
    	while(num_wanted-- && !q.empty())
    	{
    		sum += q.top();
    		q.pop();
    	}
    	return sum;
    }
};

200 ms 77.2 MB

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值