class Solution {
public long minCost(int[] basket1, int[] basket2) {
return useMap(basket1, basket2);
}
private void reduceAndRemoveIfZero(TreeMap<Integer, Integer> basketMap, Integer key, Integer val) {
var crr = basketMap.get(key);
if (crr == null)
return;
crr -= val;
if (crr <= 0) {
basketMap.remove(key);
} else {
basketMap.put(key, crr);
}
}
private long useMap(int[] basket1, int[] basket2) {
TreeMap<Integer, Integer> basket1Map = new TreeMap<>();
TreeMap<Integer, Integer> basket2Map = new TreeMap<>();
Arrays.sort(basket1);
Arrays.sort(basket2);
long min = 0L + Math.min(basket1[0], basket2[0]);
int n = basket1.length;
if (n != basket2.length)
return -1;
for (int i = 0; i < n; i++) {
basket1Map.compute(basket1[i], (k, v) -> v == null ? 1 : v + 1);
}
for (int i = 0; i < n; i++) {
if (basket1Map.containsKey(basket2[i]) && basket1Map.get(basket2[i]) > 0) {
var crr = basket1Map.get(basket2[i]);
if (crr == 1) {
basket1Map.remove(basket2[i]);
} else {
basket1Map.put(basket2[i], crr - 1);
}
} else {
basket2Map.compute(basket2[i], (k, v) -> v == null ? 1 : v + 1);
}
}
long res = 0L;
while (!basket1Map.isEmpty() && !basket2Map.isEmpty()) {
int min1 = basket1Map.firstKey();
int min2 = basket2Map.firstKey();
res += Math.min(2 * min, Math.min(min1, min2));
if ((basket1Map.get(min1) % 2 == 1) || (basket2Map.get(min2) % 2 == 1))
return -1;
if (min1 < min2) {
int max2 = basket2Map.lastKey();
reduceAndRemoveIfZero(basket1Map, min1, 2);
reduceAndRemoveIfZero(basket2Map, max2, 2);
} else {
int max1 = basket1Map.lastKey();
reduceAndRemoveIfZero(basket1Map, max1, 2);
reduceAndRemoveIfZero(basket2Map, min2, 2);
}
}
return (basket1Map.isEmpty() && basket2Map.isEmpty()) ? res : -1;
}
}