我们有一个
n
项的集合。给出两个整数数组values
和labels
,第i
个元素的值和标签分别是values[i]
和labels[i]
。还会给出两个整数numWanted
和useLimit
。从
n
个元素中选择一个子集s
:
- 子集
s
的大小 小于或等于numWanted
。s
中 最多 有相同标签的useLimit
项。一个子集的 分数 是该子集的值之和。
返回子集
s
的最大 分数 。示例 1:
输入:values = [5,4,3,2,1], labels = [1,1,2,2,3], numWanted = 3, useLimit = 1 输出:9 解释:选出的子集是第一项,第三项和第五项。示例 2:
输入:values = [5,4,3,2,1], labels = [1,3,3,3,2], numWanted = 3, useLimit = 2 输出:12 解释:选出的子集是第一项,第二项和第三项。示例 3:
输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], numWanted = 3, useLimit = 1 输出:16 解释:选出的子集是第一项和第四项。提示:
n == values.length == labels.length
1 <= n <= 2 * 104
0 <= values[i], labels[i] <= 2 * 104
1 <= numWanted, useLimit <= n
解法:将两个数组放入二维数组中,并按o[i][0]进行降序排序。依次读入values的值,并进行累加,同时对应的label值进行计数,如此时的label超过uselimit,则跳过对应value的读取
class Solution {
public int largestValsFromLabels(int[] values, int[] labels, int numWanted, int useLimit) {
int[][] VL=new int[values.length][2];
for (int i = 0; i < values.length; i++) {
VL[i][0]=values[i];
VL[i][1]=labels[i];
}
Arrays.sort(VL,((o1, o2) -> o2[0]-o1[0]));
int sum = 0;
// HashMap<Integer,Integer> map=new HashMap<>();
// for (int i = 0,j=0; i < numWanted&&j<values.length; i++,j++) {
// if (!map.containsKey(VL[j][1])) {
// map.put(VL[j][1],1);
// }else {
// int count=map.get(VL[j][1]);
// if(count<useLimit){
// map.put(VL[j][1],count+1);
// }else {
// i--;
// continue;
// }
// }
// sum=sum+VL[j][0];
// }
int map[]=new int[20001];
for (int i = 0, j = 0; i < numWanted && j < values.length; i++, j++) {
if(map[VL[j][1]]<useLimit){
map[VL[j][1]]++;
sum = sum + VL[j][0];
}else {
i--;
continue;
}
}
return sum;
}
}