LeetCode1090. 受标签影响的最大值

力扣

 

解题思路:

贪心解法

指导思想就是取最大值优先填入
如何不断取最大值: 按照顺序走一次排序即可,考虑到 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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值