最大相等频率
难度:
标签:
题目描述
代码结果
运行时间: 48 ms, 内存: 22.1 MB
/*
题目思路:
使用Java Stream来实现相同的功能。我们会使用map来统计出现次数和频率。
然后用filter和collect等操作来实现对频率的检查。
*/
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
public int maxEqualFreq(int[] nums) {
Map<Integer, Integer> count = new HashMap<>();
Map<Integer, Integer> freq = new HashMap<>();
int maxFreq = 0;
int res = 0;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
count.merge(num, 1, Integer::sum);
int newCount = count.get(num);
freq.merge(newCount - 1, -1, Integer::sum);
if (freq.get(newCount - 1) == 0) freq.remove(newCount - 1);
freq.merge(newCount, 1, Integer::sum);
maxFreq = Math.max(maxFreq, newCount);
boolean valid = maxFreq == 1 || (freq.getOrDefault(maxFreq, 0) == 1 && freq.getOrDefault(maxFreq - 1, 0) * (maxFreq - 1) + maxFreq == i + 1) || (freq.getOrDefault(1, 0) == 1 && freq.get(maxFreq) * maxFreq == i);
if (valid) res = i + 1;
}
return res;
}
}
解释
方法:
题解通过使用两个哈希表,一个记录每个数字的出现次数(哈希表a),另一个记录每个出现次数有多少个数字(哈希表b)。通过从后向前逐步检查数组,每次去掉一个元素并更新两个哈希表,尝试找到符合条件的最长前缀。具体检查条件包括:1. 哈希表b中只有两种出现频率时,其中一种频率为1且只有一个数字具有该频率,或者两种频率的数字个数相差1且只有一个数字具有更高的频率;2. 如果哈希表b中只有一种出现频率,且该频率为1,则也符合条件。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中提到`从后向前逐步检查数组`,为什么选择从后向前而不是从前向后进行检查?
▷🦆
在更新哈希表b时,当`b[l] == 0`需要删除该频率,这种处理对算法性能有什么影响?
▷🦆
解题思路中的条件`如果哈希表b中只有一种出现频率,且该频率为1`,这种情况下是如何确保删除一个元素后还能满足所有元素频率相同?
▷🦆
为什么在检查过程中用`if len(b) == 2`来判断是否有两种出现频率,这种方法在什么情况下可能会失效或不足以描述问题?
▷