LeetCode1090. 受标签影响的最大值

力扣

LeetCode1090. 受标签影响的最大值_第1张图片 

解题思路:

贪心解法

指导思想就是取最大值优先填入
如何不断取最大值: 按照顺序走一次排序即可,考虑到 label 就构建 { value, label } 的映射关系
整个过程中不断统计对应label的数量,一旦超过,则不再统计。

        

class Solution {
public:
    
    int largestValsFromLabels(vector& values, vector& labels, int numWanted, int useLimit) 
    {
        int size = labels.size();
        int sum = 0 ; 

        vector> value2labels(size); //value 和 labels的映射
        for (int i = 0; i < size; ++i)
        {
            value2labels[i] = {values[i], labels[i]};
        }

        sort(value2labels.begin(), value2labels.end(), [](const pair& a, const pair& b) {
            return a.first > b.first;
        });  // 根据value 进行降序排

       unordered_map 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;
    }
};

你可能感兴趣的:(力扣刷题,贪心算法,算法,c++)