周赛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;
            }
        }
posted @ 2022-02-13 23:21  nunuZhang  阅读(25)  评论(0)    收藏  举报