LeetCode 3527题:通过哈希表统计回答频率找到最常见的回答
一、题目解读
LeetCode 3527题要求从每日回答列表中找出出现频率最高且字典序最小的回答。输入为二维字符串数组responses,每个子数组代表一天的多条回答,需处理去重与统计,最终返回符合条件的字符串。题目考验对数据去重、频率计算及字典序比较的算法设计能力。
二、解题思路
核心思路分为两步:频率统计与字典序筛选。
1. 去重统计频率:使用unordered_map<string, int>记录每个回答出现的天数。遍历responses时,利用unordered_set对每日回答去重,避免重复计数。
2. 寻找最优解:遍历哈希表,比较频率与字典序。若当前回答频率更高,或频率相同时字典序更小,则更新结果。
该解法避免多次遍历,通过单次统计与一次筛选完成,时间复杂度优化至O(N),N为总回答数。
三、解题步骤
1. 初始化哈希表:声明freq存储回答频率。
2. 统计每日去重后的频率:
○ 遍历responses,每日回答存入day_set(自动去重)。
○ 对去重后的每个回答response,频率freq[response]++。
3. 筛选最优回答:
○ 初始化result为空,max_count为0。
○ 遍历freq,若当前count大于max_count,或count相等且response字典序更小,则更新result与max_count。
4. 返回结果:最终result即为共同回答。
四、代码与注释
class Solution { public: string findCommonResponse(vector<vector<string>>& responses) { unordered_map<string, int> freq; // 统计每个回答出现的天数(每个子数组内去重) for (auto& day_responses : responses) { unordered_set<string> day_set(day_responses.begin(), day_responses.end()); for (const auto& response : day_set) { freq[response]++; } } string result; int max_count = 0; // 找出出现频率最高且字典序最小的回答 for (const auto& [response, count] : freq) { if (count > max_count || (count == max_count && response < result)) { max_count = count; result = response; } } return result; } };
五、总结
本解法通过哈希表与去重技术,将复杂的多重遍历转化为单次统计与筛选,大幅降低时间复杂度。关键在于利用unordered_set自动去重,避免重复计算,同时结合字典序比较实现多条件优化。此思路适用于处理需统计频率且考虑字典序的场景,为算法效率提升提供有效参考。
原创内容 转载请注明出处