Medium
题目描述
给你一个二维字符串数组 responses,其中 responses[i] 是一个字符串数组,表示第 i 天的调查回复。
在移除每个 responses[i] 中的重复回复后,返回所有天数中最常见的回复。如果有多个回复出现次数相同,返回字典序最小的回复。
示例 1:
输入:responses = [["good","ok","good","ok"],["ok","bad","good","ok","ok"],["good"],["bad"]]
输出:"good"
解释:
移除每个列表中的重复项后,responses = [["good", "ok"], ["ok", "bad", "good"], ["good"], ["bad"]]。
"good" 出现 3 次,"ok" 出现 2 次,"bad" 出现 2 次。
返回 "good",因为它的频率最高。
示例 2:
输入:responses = [["good","ok","good"],["ok","bad"],["bad","notsure"],["great","good"]]
输出:"bad"
解释:
移除每个列表中的重复项后,responses = [["good", "ok"], ["ok", "bad"], ["bad", "notsure"], ["great", "good"]]。
"bad"、"good" 和 "ok" 各出现 2 次。
输出 "bad",因为在具有最高频率的单词中它的字典序最小。
约束条件:
1 <= responses.length <= 10001 <= responses[i].length <= 10001 <= responses[i][j].length <= 10responses[i][j]仅由小写英文字母组成
提示:
- 使用哈希表。
解题思路
这道题需要我们找到所有天数中出现频率最高的回复,并且在频率相同时选择字典序最小的。
解题思路分为几个步骤:
去重处理:对于每一天的回复列表,我们需要先去除重复的回复。可以使用集合(Set)来实现去重。
频率统计:使用哈希表来统计每个唯一回复在所有天数中的出现次数。遍历去重后的每一天回复,累加每个回复的出现频率。
找到最优解:遍历哈希表,找到出现频率最高的回复。如果有多个回复频率相同,选择字典序最小的那个。
具体实现中,我们可以:
- 对每一天的回复使用集合去重
- 用哈希表记录每个回复的总出现天数
- 最后遍历哈希表找到频率最高且字典序最小的回复
时间复杂度主要来自于遍历所有回复和去重操作,空间复杂度主要是哈希表存储各回复的频率。
代码实现
class Solution {
public:
string findCommonResponse(vector<vector<string>>& responses) {
unordered_map<string, int> freq;
for (auto& dayResponses : responses) {
unordered_set<string> uniqueResponses(dayResponses.begin(), dayResponses.end());
for (const string& response : uniqueResponses) {
freq[response]++;
}
}
int maxFreq = 0;
string result = "";
for (const auto& pair : freq) {
if (pair.second > maxFreq || (pair.second == maxFreq && pair.first < result)) {
maxFreq = pair.second;
result = pair.first;
}
}
return result;
}
};
class Solution:
def findCommonResponse(self, responses: List[List[str]]) -> str:
freq = {}
for day_responses in responses:
unique_responses = set(day_responses)
for response in unique_responses:
freq[response] = freq.get(response, 0) + 1
max_freq = 0
result = ""
for response, count in freq.items():
if count > max_freq or (count == max_freq and response < result):
max_freq = count
result = response
return result
public class Solution {
public string FindCommonResponse(IList<IList<string>> responses) {
var freq = new Dictionary<string, int>();
foreach (var dayResponses in responses) {
var uniqueResponses = new HashSet<string>(dayResponses);
foreach (var response in uniqueResponses) {
if (freq.ContainsKey(response)) {
freq[response]++;
} else {
freq[response] = 1;
}
}
}
int maxFreq = 0;
string result = "";
foreach (var pair in freq) {
if (pair.Value > maxFreq || (pair.Value == maxFreq && (result == "" || string.Compare(pair.Key, result) < 0))) {
maxFreq = pair.Value;
result = pair.Key;
}
}
return result;
}
}
var findCommonResponse = function(responses) {
const frequency = new Map();
for (const response of responses) {
const unique = [...new Set(response)];
for (const word of unique) {
frequency.set(word, (frequency.get(word) || 0) + 1);
}
}
let maxFreq = 0;
let result = "";
for (const [word, freq] of frequency) {
if (freq > maxFreq || (freq === maxFreq && word < result)) {
maxFreq = freq;
result = word;
}
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(N × M) | 其中 N 是天数,M 是每天平均回复数。需要遍历所有回复进行去重和统计 |
| 空间复杂度 | O(K) | 其中 K 是所有唯一回复的总数,用于存储频率哈希表和临时集合 |
相关题目
- . Majority Element (Easy)