题解 | 农场牛群众数

语言: C++

知识点: 哈希表

分析: 使用unordered_map记录编号与其出现次数,同时定义变量记录当前的众数及其出现次数。依次遍历编号,遍历过程中维护unordered_map中的数据后判断当前编号的出现次数是否大于等于之前的众数的出现次数,若满足则更新当前众数及其出现次数,同时将此时的众数记录到结果集中。(需注意题目中提到若出现多个编号出现次数相同的情况,则选择编号最大的那一个,因此在更新当前众数时需要进行编号是否相等的额外判断及选择)

代码实现:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> findMode(vector<int>& nums) {
        unordered_map<int, int> mp; // 存储编号与出现次数的映射
        vector<int> res; // 存储最终各个众数结果
        int maxC = 0, maxN = nums[0]; // 记录当前众数及其出现的次数
        for(int i = 0; i < nums.size(); i++)
        {
            mp[nums[i]]++; // 当前编号的出现次数加一
            if(mp[nums[i]] >= maxC) // 若当前的编号出现次数大于等于之前的众数的出现次数,则当前编号变为新的众数
            {
                maxN = mp[nums[i]] == maxC ? max(maxN, nums[i]) : nums[i]; // 根据题意,若出现次数相同的情况,选择数值更大的做为最终结果。
                maxC = mp[nums[i]]; // 更新新的众数出现次数
            }
            res.emplace_back(maxN); // 将此时的众数加入结果集中
        }
        return res;
    }
};