Java 最大子集分数算法详解
思路: 首先将 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;
}
}
}
原文地址: https://www.cveoy.top/t/topic/ot9u 著作权归作者所有。请勿转载和采集!