当前位置:   article > 正文

LeetCode:2671. 频率跟踪器(双hash Java)

LeetCode:2671. 频率跟踪器(双hash Java)

目录

2671. 频率跟踪器

题目描述:

实现代码与解析:

单hash(超时)

双hash

原理思路:


2671. 频率跟踪器

题目描述:

        请你设计并实现一个能够对其中的值进行跟踪的数据结构,并支持对频率相关查询进行应答。

实现 FrequencyTracker 类:

  • FrequencyTracker():使用一个空数组初始化 FrequencyTracker 对象。
  • void add(int number):添加一个 number 到数据结构中。
  • void deleteOne(int number):从数据结构中删除一个 number 。数据结构 可能不包含 number ,在这种情况下不删除任何内容。
  • bool hasFrequency(int frequency): 如果数据结构中存在出现 frequency 次的数字,则返回 true,否则返回 false

示例 1:

输入
["FrequencyTracker", "add", "add", "hasFrequency"]
[[], [3], [3], [2]]
输出
[null, null, null, true]

解释
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.add(3); // 数据结构现在包含 [3]
frequencyTracker.add(3); // 数据结构现在包含 [3, 3]
frequencyTracker.hasFrequency(2); // 返回 true ,因为 3 出现 2 次

示例 2:

输入
["FrequencyTracker", "add", "deleteOne", "hasFrequency"]
[[], [1], [1], [1]]
输出
[null, null, null, false]

解释
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.add(1); // 数据结构现在包含 [1]
frequencyTracker.deleteOne(1); // 数据结构现在为空 []
frequencyTracker.hasFrequency(1); // 返回 false ,因为数据结构为空

示例 3:

输入
["FrequencyTracker", "hasFrequency", "add", "hasFrequency"]
[[], [2], [3], [1]]
输出
[null, false, null, true]

解释
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.hasFrequency(2); // 返回 false ,因为数据结构为空
frequencyTracker.add(3); // 数据结构现在包含 [3]
frequencyTracker.hasFrequency(1); // 返回 true ,因为 3 出现 1 次

提示:

  • 1 <= number <= 105
  • 1 <= frequency <= 105
  • 最多调用 adddeleteOne 和 hasFrequency 共计 2 * 105 次

实现代码与解析:

单hash(超时)

  1. package lt.lt24321.频率跟踪器2671;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. class FrequencyTracker {
  5. public Map<Integer, Integer> map;
  6. public FrequencyTracker() {
  7. map = new HashMap<>();
  8. }
  9. public void add(int number) {
  10. if (map.containsKey(number)) {
  11. map.put(number, map.get(number) + 1);
  12. } else {
  13. map.put(number, 1);
  14. }
  15. }
  16. public void deleteOne(int number) {
  17. if (!map.containsKey(number))return;
  18. int cnt = map.get(number);
  19. if (cnt == 1) {
  20. map.remove(number);
  21. } else {
  22. map.put(number, cnt - 1);
  23. }
  24. }
  25. public boolean hasFrequency(int frequency) {
  26. if (map.containsValue(frequency)) return true;
  27. else return false;
  28. }
  29. }

所以考虑优化。

双hash

  1. class FrequencyTracker {
  2. private static final int N = 100001;
  3. private int[] num;
  4. private int[] numCnt;
  5. public FrequencyTracker() {
  6. num = new int[N];
  7. numCnt = new int[N];
  8. }
  9. public void add(int number) {
  10. numCnt[num[number]]--; // 去掉原来频次的个数
  11. num[number]++;
  12. numCnt[num[number]]++; // 新添后的频次加一
  13. }
  14. public void deleteOne(int number) {
  15. if (num[number] == 0) return ;
  16. numCnt[num[number]]--; // 去掉原来频次的个数
  17. num[number]--;
  18. numCnt[num[number]]++; // 减去后的频次加一
  19. }
  20. public boolean hasFrequency(int frequency) {
  21. return numCnt[frequency] > 0;
  22. }
  23. }

原理思路:

        一个hash记录数字出现的个数,一个hash记录每个频率出现次数。数据范围小,直接用数组下标模拟hash即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/317747
推荐阅读
相关标签
  

闽ICP备14008679号