出现最频繁的偶数元素

标签: 数组 哈希表 计数

难度: 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 <= 2000
  • 0 <= nums[i] <= 105

Submission

运行时间: 45 ms

内存: 16.2 MB

class Solution:
    def mostFrequentEven(self, nums: List[int]) -> int:
        new = [x for x in nums if x % 2 == 0]
        if new == []:
            return -1
        curr = 2001
        freq = 0
        for key, value in Counter(new).items():
            if value > freq:
                curr = key
                freq = value
            elif value == freq:
                curr = min(key, curr)
        return curr

Explain

此题解首先通过列表推导过滤出数组中的所有偶数元素,存入列表 new。若 new 为空,则直接返回 -1,表示没有偶数元素。接下来,使用 Counter 来统计 new 中每个元素的出现频次。通过遍历这些元素及其频次,维护一个变量 curr 来记录当前出现最频繁的偶数元素,初始值设为 2001,超过数组元素的最大可能值,以便于更新。同时,使用 freq 变量记录最大频次。在遍历过程中,如果发现更高的频次,则更新 curr 和 freq。如果发现相同的频次,比较并更新 curr 为更小的偶数。最终返回 curr,即为出现最频繁的最小偶数元素。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def mostFrequentEven(self, nums: List[int]) -> int:
        # 过滤出 nums 中的偶数元素
        new = [x for x in nums if x % 2 == 0]
        # 如果没有偶数,返回 -1
        if not new:
            return -1
        # 初始化最大频次和当前最频繁的偶数
        curr = 2001
        freq = 0
        # 统计偶数元素的频次
        for key, value in Counter(new).items():
            # 更新最大频次和对应的偶数
            if value > freq:
                curr = key
                freq = value
            # 如果频次相同,选择较小的偶数
            elif value == freq:
                curr = min(key, curr)
        return curr

Explore

使用列表推导来过滤偶数可以简化后续的代码逻辑,因为这样做可以直接生成包含所有需要处理的偶数的新列表。这种方法的优点是代码更清晰、易于理解,并且可以减少后续操作中的条件判断,提高效率。缺点包括可能增加内存使用,因为需要额外存储过滤后的偶数列表,特别是当原始数组很大且偶数占比较高时。

curr初始设置为2001是为了确保在后续遍历中,任何一个实际出现的偶数都会比这个初始值小,从而能够在首次比较时被更新。这种方法简化了代码逻辑,避免了处理特殊情况或额外的条件判断。更合理的方法可能是使用Python的float('inf')作为初始值,这是一个表示无限大的值,可以更清楚地表达“比任何数都大”的意图,而且不依赖于具体数值范围。

是的,可以通过一次遍历来同时解决频次统计和找到最小值的问题。在遍历nums数组时,可以直接使用一个字典来统计偶数的频率,并同时更新当前最频繁且最小的偶数。这种做法减少了对列表的额外迭代,同时在统计频次的同时即时更新当前最优解,提高了效率和代码的简洁性。