力扣——2404、出现最频繁的偶数元素

98 阅读1分钟

力扣——2404、出现最频繁的偶数元素

2404. 出现最频繁的偶数元素

给你一个整数数组 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

问题解析

我们可以用一个哈希表来记录所有元素的出现次数,同时用一个变量mn记录答案(初始可以给mn设置一个很大的数或者设置一个奇数)。

遍历数组,如果当前数是偶数(判断是否为偶数,可以用当前数%2,判断结果,如果是0则说明是偶数,反之不是),则在哈希表里记录的出现次数+1,如果当前偶数的出现次数大于mn的出现次数,就把mn更换为当前偶数。

特别的,因为我们要的答案满足的条件有三个:

  1. 是偶数
  2. 出现次数最多
  3. 最小

所以如果当前偶数的出现次数是等于mn的出现次数,且当前偶数要比mn更小的话,我们也用当前偶数替换掉mn。

最后如果mn是我们一开始设置的初始值,说明数组没有偶数,返回-1;反之直接返回mn。

AC代码

class Solution {
public:
    int mostFrequentEven(vector<int>& nums) {
        int mn=10001,n=nums.size();
        unordered_map<int,int>mymap;
        for(int i=0;i<n;i++)
        {
            if(nums[i]%2==0)
            {
                mymap[nums[i]]++;
                if(mymap[nums[i]]>mymap[mn])
                {
                    mn=nums[i];
                }
                else if(mymap[nums[i]]==mymap[mn])
                {
                    mn=min(mn,nums[i]);
                }
            }
        }
        return mn==10001?-1:mn;
    }
};