50%测试案例未超时,其余超时,但是锻炼思路的一种解法
import java.util.*;
public class Solution {
public int[] solve (int n, int q, int[] a, int[] p) {
Arrays.sort(a);
int[] ans = new int[q];
for(int i=0;i<q;i++){
ans[i] = cost(a,p[i]);
}
return ans;
}
public static int cost(int[] a,int same){
Map<Integer,Integer> map = new HashMap<>();
int min = Integer.MAX_VALUE;
for(int i=0;i<a.length;i++) {
min = Math.min(min, a[i]);
int cnt = map.getOrDefault(a[i], 0);
map.put(a[i], cnt + 1);
if (cnt + 1 > same) return 0;
}
int ans = Integer.MAX_VALUE;
int minWater = -1;
for(Integer k : map.keySet()){
int tmpCost = 0;
int needChange = same-map.get(k);
int step = 1;
boolean findFlag = true;
while(needChange>0){
if(k-step < min){
findFlag = false;
break;
}
if(map.getOrDefault(k-step,0)!=0){
int change = Math.min(needChange,map.getOrDefault(k-step,0));
needChange -= change;
tmpCost += change*step;
}
step++;
}
if(findFlag && tmpCost < ans){
ans = tmpCost;
minWater = k;
}
}
int start=0;
for(;start<a.length;start++){
if(a[start] == minWater) break;
}
int count = same - map.get(minWater);
while(count>0){
a[--start] = minWater;
count--;
}
return ans;
}
}