Skip to content

Latest commit

 

History

History
206 lines (165 loc) · 4.4 KB

File metadata and controls

206 lines (165 loc) · 4.4 KB

English Version

题目描述

给你一个整数数组 nums ,返回出现最频繁的偶数元素。

如果存在多个满足条件的元素,只需要返回 最小 的一个。如果不存在这样的元素,返回 -1

 

示例 1:

输入:nums = [0,1,2,2,4,4,1]
输出:2
解释:
数组中的偶数元素为 0、2 和 4 ,在这些元素中,2 和 4 出现次数最多。
返回最小的那个,即返回 2 。

示例 2:

输入:nums = [4,4,4,9,2,4]
输出:4
解释:4 是出现最频繁的偶数元素。

示例 3:

输入:nums = [29,47,21,41,13,37,25,7]
输出:-1
解释:不存在偶数元素。

 

提示:

  • 1 <= nums.length <= 2000
  • 0 <= nums[i] <= 105

解法

方法一:哈希表

用哈希表统计所有偶数元素出现的次数,然后找出出现次数最多且值最小的偶数元素。

时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组的长度。

Python3

class Solution:
    def mostFrequentEven(self, nums: List[int]) -> int:
        cnt = Counter(v for v in nums if v % 2 == 0)
        ans, mx = -1, 0
        for v, t in cnt.items():
            if mx < t or (mx == t and ans > v):
                mx = t
                ans = v
        return ans

Java

class Solution {
    public int mostFrequentEven(int[] nums) {
        Map<Integer, Integer> cnt = new HashMap<>();
        for (int v : nums) {
            if (v % 2 == 0) {
                cnt.put(v, cnt.getOrDefault(v, 0) + 1);
            }
        }
        int ans = -1, mx = 0;
        for (var e : cnt.entrySet()) {
            int v = e.getKey(), t = e.getValue();
            if (mx < t || (mx == t && ans > v)) {
                mx = t;
                ans = v;
            }
        }
        return ans;
    }
}

C++

class Solution {
public:
    int mostFrequentEven(vector<int>& nums) {
        unordered_map<int, int> cnt;
        for (int v : nums) {
            if (v % 2 == 0) {
                ++cnt[v];
            }
        }
        int ans = -1, mx = 0;
        for (auto [v, t] : cnt) {
            if (mx < t || (mx == t && ans > v)) {
                mx = t;
                ans = v;
            }
        }
        return ans;
    }
};

Go

func mostFrequentEven(nums []int) int {
	cnt := map[int]int{}
	for _, v := range nums {
		if v%2 == 0 {
			cnt[v]++
		}
	}
	ans, mx := -1, 0
	for v, t := range cnt {
		if mx < t || (mx == t && ans > v) {
			mx = t
			ans = v
		}
	}
	return ans
}

TypeScript

function mostFrequentEven(nums: number[]): number {
    const map = new Map();
    for (const num of nums) {
        if (num % 2 === 0) {
            map.set(num, (map.get(num) ?? 0) + 1);
        }
    }
    if (map.size === 0) {
        return -1;
    }

    let res = 0;
    let max = 0;
    for (const [k, v] of map.entries()) {
        if (v > max || (v == max && k < res)) {
            max = v;
            res = k;
        }
    }
    return res;
}

Rust

use std::collections::HashMap;
impl Solution {
    pub fn most_frequent_even(nums: Vec<i32>) -> i32 {
        let mut map = HashMap::new();
        for &num in nums.iter() {
            if num % 2 == 0 {
                *map.entry(num).or_insert(0) += 1;
            }
        }
        if map.len() == 0 {
            return -1;
        }

        let mut res = 0;
        let mut max = 0;
        for (&k, &v) in map.iter() {
            if v > max || (v == max && k < res) {
                max = v;
                res = k;
            }
        }
        res
    }
}

...