周赛280
周赛
使用Entry结构时,语句:Map.Entry<>
class Solution {
public int minimumOperations(int[] nums) {
if(nums == null || nums.length <2) return 0;
Map<Integer, Integer> mapEven = new HashMap<>();
Map<Integer, Integer> mapOdd = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
if(i % 2 == 0) {
mapEven.put(nums[i], mapEven.getOrDefault(nums[i], 0) + 1);
} else {
mapOdd.put(nums[i], mapOdd.getOrDefault(nums[i], 0) + 1);
}
}
PriorityQueue<Map.Entry<Integer, Integer>> pqEven = new PriorityQueue<>((e1, e2) -> (e2.getValue() - e1.getValue()));
for(Map.Entry<Integer, Integer> e : mapEven.entrySet()) {
pqEven.add(e);
}
PriorityQueue<Map.Entry<Integer, Integer>> pqOdd = new PriorityQueue<>((e1, e2) -> (e2.getValue() - e1.getValue()));
for(Map.Entry<Integer, Integer> e : mapOdd.entrySet()) {
pqOdd.add(e);
}
int evenKey = pqEven.peek().getKey();
int evenMax1 = pqEven.peek().getValue();
pqEven.poll();
int evenMax2 = pqEven.isEmpty() ? 0 : pqEven.peek().getValue();
int oddKey = pqOdd.peek().getKey();
int oddMax1 = pqOdd.peek().getValue();
pqOdd.poll();
int oddMax2 = pqOdd.isEmpty() ? 0 : pqOdd.peek().getValue();
int count = 0;
if(evenKey == oddKey) {
//[1,1,1,1,1] ,[1,2,2,2,2]这些情况时
//没有必要分清是让even位置换,还是odd位置换
//求两种情况下的最小值即可
count = Math.min(nums.length - evenMax1 - oddMax2, nums.length - evenMax2 - oddMax1);
} else {//位置总数-我的位置 = 要置换的位置
// int evenC = pqEven.size() == 1 ? 0 : evenPos - pqEven.peek().getValue();
// int oddC = pqOdd.size() == 1 ? 0 : oddPos - pqOdd.peek().getValue();
// count = evenC + oddC;
count = nums.length - evenMax1 - oddMax1;
}
return count;
}
}
求一个数组中前2大的值
//test case: [2, 4, 3]
int evenMax1 = 0, evenMax2 = 0;
int evenKey = 0, oddKey = 0;
for(int key : mapEven.keySet()) {
int v = mapEven.get(key);
if(v >= evenMax1) {
evenMax2 = evenMax1;
evenMax1 = v;
evenKey = key;
} else if(v >= evenMax2){//对于第二大的值,要对v再过滤一次
evenMax2 = v;
}
}
浙公网安备 33010602011771号