思路: 首先将 values 和 labels 组成一个二元组的数组 pairs,然后将数组 pairs 按照 values 从大到小排序。然后依次枚举排好序的数组 pairs,将其放入集合中,如果集合中相同标签的元素个数已经达到了 useLimit,则跳过该元素。最后计算集合中的元素的值之和即为最大分数。

代码实现:

public class MaxSubsetScore {

    public int maxSubsetScore(int[] values, int[] labels, int numWanted, int useLimit) {
        int n = values.length;
        Pair[] pairs = new Pair[n];
        for (int i = 0; i < n; i++) {
            pairs[i] = new Pair(values[i], labels[i]);
        }
        Arrays.sort(pairs, Collections.reverseOrder((a, b) -> a.value - b.value));

        Map<Integer, Integer> labelCount = new HashMap<>();
        int score = 0;
        int count = 0;
        for (Pair pair : pairs) {
            if (labelCount.getOrDefault(pair.label, 0) < useLimit && count < numWanted) {
                score += pair.value;
                labelCount.put(pair.label, labelCount.getOrDefault(pair.label, 0) + 1);
                count++;
            }
        }
        return score;
    }

    static class Pair {
        int value;
        int label;

        Pair(int value, int label) {
            this.value = value;
            this.label = label;
        }
    }
}
Java 最大子集分数算法详解

原文地址: https://www.cveoy.top/t/topic/ot9u 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录