【每日一题Day215】LC1090受标签影响的最大值 | 贪心+排序+哈希表

给定一个元素集合和对应的标签,以及取值限制,文章描述了一个优先选取高值并遵循标签限制的选择策略。通过哈希表记录标签使用情况,对值进行降序排序,以最大化子集得分。算法的时间复杂度为O(nlogn),空间复杂度为O(n)。
摘要由CSDN通过智能技术生成

受标签影响的最大值【LC1090】

我们有一个 n 项的集合。给出两个整数数组 valueslabels ,第 i 个元素的值和标签分别是 values[i]labels[i]。还会给出两个整数 numWanteduseLimit

n 个元素中选择一个子集 s :

  • 子集 s 的大小 小于或等于 numWanted
  • s最多 有相同标签的 useLimit 项。

一个子集的 分数 是该子集的值之和。

返回子集 s 的最大 分数

  • 思路

    • 由于能够取的数有数量限制,因此我们应该优先取数值较大的数【局部最优】,以获得最大分数【全局最优】
    • 由于相同标签只能选择useLimit个数,因此需要使用哈希表记录每个标签已经取的数的个数。
    • 将数组按照值降序排序,判断当前标签能否取,如果能那么取该数,不能直接跳至下一个数
  • 实现

    class Solution {
        public int largestValsFromLabels(int[] values, int[] labels, int numWanted, int useLimit) {
            int n = values.length;
            int[][] data = new int[n][2];
            Map<Integer,Integer> map = new HashMap<>();
            int res = 0;
            for (int i = 0; i < n; i++){
                data[i][0] = values[i];
                data[i][1] = labels[i];
            }
            Arrays.sort(data, (o1, o2) -> o2[0] - o1[0]);
            int count = 0, i = 0;
            while (count < numWanted && i < n){
                if (map.getOrDefault(data[i][1], 0) < useLimit){
                    count++;
                    res += data[i][0];
                    map.put(data[i][1], map.getOrDefault(data[i][1], 0) + 1);
                }
                i++;
                
            }
            return res;
    
    
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n l o g n ) \mathcal{O}(nlogn) O(nlogn)
      • 空间复杂度: O ( n ) \mathcal{O}(n) O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值