【哈希+map】2404. 出现最频繁的偶数元素
Problem: 2404. 出现最频繁的偶数元素
思路
从数组中找出出现次数最多的偶数(如果这样的数有多个,选取较小的那个)
解题方法
原本的想法是使用map+set,map当作哈希表用来计数,set来记录出现次数最多的偶数,(看了大佬的代码)后来优化了只用map,使用int变量res记录出现次数最多的偶数,如果出现次数一样多,且这个数较小,则更新res。
顺便复习了下C++中map和set的用法,这两个都只能通过使用迭代器遍历,但是map可以通过map[key]的方式来访问和赋值,可使用的函数用begin()
、end()
、find()
、clear()
等等。
复杂度
时间复杂度:
$O(n)$
空间复杂度:
$O(n)$
Code
原版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
class Solution { public: int mostFrequentEven(vector<int>& nums) { unordered_map<int, int> mp; for(int i = 0; i < nums.size(); i++){ int num = nums[i]; if(num%2==0){ if(mp.find(num)==mp.end()){ mp[num] = 1; }else{ mp[num]++; } } } int max = -1; set<int> res; for(unordered_map<int, int>::iterator it = mp.begin(); it != mp.end(); it++){ if(it->second > max){ max = it->second; res.clear(); res.insert(it->first); }else if(it->second == max){ res.insert(it->first); } } if(max==-1) return -1; else return *(res.begin()); } };
|
简单优化后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
class Solution { public: int mostFrequentEven(vector<int>& nums) { unordered_map<int, int> mp; for(int i = 0; i < nums.size(); i++){ int num = nums[i]; if(num%2==0){ if(mp.find(num)==mp.end()){ mp[num] = 1; }else{ mp[num]++; } } } int max = -1; int res; for(unordered_map<int, int>::iterator it = mp.begin(); it != mp.end(); it++){ if(it->second > max){ max = it->second; res = it->first; }else if(it->second == max && res > it->first){ res = it->first; } } if(max==-1) return -1; else return res; } };
|