第一题:6176. 出现最频繁的偶数元素
思路:hash表,统计元素出现次数,返回出现频率最多且最小的元素即可
class Solution { public: int mostFrequentEven(vector<int>& nums) { int res = -1; unordered_map<int,int> mp; for(auto k : nums) mp[k]++; int tmp = 0; for(auto it : mp){ int x = it.first, y = it.second; if(x % 2) continue; if(y > tmp || (y == tmp && x < res)) res = x, tmp = y; } return res; } };
第二题:6177. 子字符串的最优划分
思路:统计小写字母出现次数,如果出现第二次则需要划分且将统计数组归零即可
class Solution { public: int partitionString(string s) { int a[26] = {0}; int res = 0; for(int i = 0; i < s.size(); i++){ int k = s[i] - 'a' + 0; if(a[k] == 0) a[k]++; else { res++; for(int j = 0; j < 26; j++) a[j] = 0; a[k]++; } } if(res == 0) return 1; else return res+1; } };
第三题:6178. 将区间分为最少组数
思路:利用差分找到重叠最多的点的次数,即为答案所求
class Solution { public: int inter[1000010]; void diff(int l, int r){ inter[l] += 1; inter[r+1] -= 1; }//差分 int minGroups(vector<vector<int>>& intervals) { memset(inter,0,sizeof inter); for(auto i : intervals){ diff(i[0],i[1]); } for(int i = 1; i < 1000010; i++){ inter[i] += inter[i-1]; }//差分为前缀和的逆运算 如此恢复“原数组” int res = 0, max_v = 0; for(int i = 0; i < 1000010; i++){ if(inter[i] > max_v){ max_v = inter[i]; } } return max_v; } };