每日一题 力扣 1090 https://leetcode.cn/problems/largest-values-from-labels/
每日一题 力扣 1090 https://leetcode.cn/problems/largest-values-from-labels/
核心代码如下
/**
*
* @param values
* @param labels
* @param numWanted size<=numWanted
* @param useLimit same labels < useLimit
* @return
*/
public int largestValsFromLabels(int[] values, int[] labels, int numWanted, int useLimit) {
if (useLimit==0||numWanted==0){
return 0;
}
// 按照values排序
int n=values.length;
int[][] nums = new int[n][2];
for (int i = 0; i < n; i++) {
nums[i]=new int[]{values[i],labels[i]};
}
Arrays.sort(nums,(o1,o2)->{
if (o1[0]!=o2[0]){
return o2[0]-o1[0];
}else {
return o2[1]-o1[1];
}
});
// 拿最多numWanted
int sum=0;
int size=0;
int sameLabel=0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length ; i++) {
if (size<numWanted){
// 可以尝试放进来
Integer pre = map.getOrDefault(nums[i][1], 0);
if (pre<useLimit){
// 可以放进来
map.put(nums[i][1],pre+1);
sum+=nums[i][0];
size++;
}else {
// 重复了 不让放
}
}else {
break;
}
}
return sum;