Easy
题目描述
给你一个整数数组 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 <= 20000 <= nums[i] <= 10^5
解题思路
这是一道典型的哈希表计数问题,解题思路如下:
方法一:哈希表计数(推荐)
- 遍历数组,使用哈希表统计每个偶数元素的出现频率
- 在统计过程中记录最大频率和对应的最小偶数
- 当遇到频率更高的偶数时更新结果,频率相同但数值更小时也要更新
方法二:两次遍历 第一次遍历统计所有偶数频率,第二次遍历找出符合条件的结果。但相比方法一效率稍低。
优化细节:
- 可以在一次遍历中同时完成计数和结果更新
- 判断偶数使用位运算
(num & 1) == 0比取模运算更高效 - 只需要关注偶数元素,忽略奇数可以减少哈希表大小
时间复杂度为 O(n),空间复杂度为 O(k),其中 k 是不同偶数的个数。
代码实现
class Solution {
public:
int mostFrequentEven(vector<int>& nums) {
unordered_map<int, int> count;
int maxFreq = 0;
int result = -1;
for (int num : nums) {
if (num % 2 == 0) {
count[num]++;
if (count[num] > maxFreq || (count[num] == maxFreq && num < result)) {
maxFreq = count[num];
result = num;
}
}
}
return result;
}
};
class Solution:
def mostFrequentEven(self, nums: List[int]) -> int:
count = {}
max_freq = 0
result = -1
for num in nums:
if num % 2 == 0:
count[num] = count.get(num, 0) + 1
if count[num] > max_freq or (count[num] == max_freq and num < result):
max_freq = count[num]
result = num
return result
public class Solution {
public int MostFrequentEven(int[] nums) {
Dictionary<int, int> count = new Dictionary<int, int>();
int maxFreq = 0;
int result = -1;
foreach (int num in nums) {
if (num % 2 == 0) {
if (count.ContainsKey(num)) {
count[num]++;
} else {
count[num] = 1;
}
if (count[num] > maxFreq || (count[num] == maxFreq && num < result)) {
maxFreq = count[num];
result = num;
}
}
}
return result;
}
}
var mostFrequentEven = function(nums) {
const evenCount = new Map();
for (const num of nums) {
if (num % 2 === 0) {
evenCount.set(num, (evenCount.get(num) || 0) + 1);
}
}
if (evenCount.size === 0) return -1;
let maxFreq = 0;
let result = -1;
for (const [num, freq] of evenCount) {
if (freq > maxFreq || (freq === maxFreq && num < result)) {
maxFreq = freq;
result = num;
}
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历整个数组一次 |
| 空间复杂度 | O(k) | k 是数组中不同偶数的个数,最坏情况下为 O(n) |
相关题目
. Majority Element (Easy)
. Majority Element II (Medium)
. Top K Frequent Elements (Medium)
. Sort Characters By Frequency (Medium)