当前位置:首页 > 力扣 > LeetCode 3527题:通过哈希表统计回答频率找到最常见的回答

LeetCode 3527题:通过哈希表统计回答频率找到最常见的回答

1个月前 (08-08)

LeetCode 3527题:通过哈希表统计回答频率找到最常见的回答 哈希表 频率统计 字典序 第1张

一、题目解读

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自动去重,避免重复计算,同时结合字典序比较实现多条件优化。此思路适用于处理需统计频率且考虑字典序的场景,为算法效率提升提供有效参考。



原创内容 转载请注明出处

分享给朋友:

相关文章

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

一、题目解读    2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所...

手把手教你实现哈希表:从代码到原理的新手友好指南

一、简介和应用哈希表(Hash Table)是一种高效的数据结构,通过哈希函数将键(Key)映射到存储位置,实现O(1)时间复杂度的查找、插入和删除操作。它广泛应用于缓存系统、数据库索引、字典查询等场...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

一、题目解读力扣2588题要求计算给定数组中“美丽子数组”的数量。所谓“美丽子数组”,是指子数组的异或和为0。题目关键在于理解子数组异或和的性质,并通过高效算法统计符合条件的子数组数量。二、解题思路采...

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

一、题目解读LeetCode 1031题要求在不重叠的前提下,从给定数组nums中寻找两个长度分别为firstLen和secondLen的连续子数组,使其和最大。题目强调子数组必须不重叠,即两个子数组...

LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)

LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)

一、题目解读LeetCode 2576题要求在一个整数数组中寻找最多可标记的下标对:若 nums[i] * 2 <= nums[j](i ≠ j),则下标 i 和 j 可配对标记。例如,输入 [...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。