解题思路:
贪心解法
指导思想就是取最大值优先填入
如何不断取最大值: 按照顺序走一次排序即可,考虑到 label 就构建 { value, label } 的映射关系
整个过程中不断统计对应label的数量,一旦超过,则不再统计。
class Solution {
public:
int largestValsFromLabels(vector<int>& values, vector<int>& labels, int numWanted, int useLimit)
{
int size = labels.size();
int sum = 0 ;
vector<pair<int, int>> value2labels(size); //value 和 labels的映射
for (int i = 0; i < size; ++i)
{
value2labels[i] = {values[i], labels[i]};
}
sort(value2labels.begin(), value2labels.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
return a.first > b.first;
}); // 根据value 进行降序排
unordered_map<int, int> label2count; //构建label 和 次数 的映射
for(auto& e : value2labels)
{
int label = e.second;
if (numWanted && label2count[label] < useLimit) // 可使用次数和想要的次数都满足条件
{
sum += e.first;
--numWanted; //可使用label --
label2count[label]++; //使用次数++
}
if (!numWanted)// 已达到最大数字提前结束循环
{
break;
}
}
return sum;
}
};