美文网首页
【算法题】6417. 频率跟踪器

【算法题】6417. 频率跟踪器

作者: 程序员小2 | 来源:发表于2023-05-07 07:51 被阅读0次

题目:

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

实现 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 <= 10^5
1 <= frequency <= 10^5
最多调用 add、deleteOne 和 hasFrequency 共计 2 * 10^5 次

java代码:

class FrequencyTracker {
    private Map<Integer, Integer> cnt = new HashMap<>(); // 每个数的出现次数
    private Map<Integer, Integer> freq = new HashMap<>(); // 出现次数的出现次数

    public FrequencyTracker() {}

    public void add(int number) {
        // 直接减,因为下面询问的不会涉及到 frequency=0
        freq.merge(cnt.getOrDefault(number, 0), -1, Integer::sum);
        int c = cnt.merge(number, 1, Integer::sum);
        freq.merge(c, 1, Integer::sum);
    }

    public void deleteOne(int number) {
        if (cnt.getOrDefault(number, 0) == 0) return; // 不删除任何内容
        freq.merge(cnt.get(number), -1, Integer::sum);
        int c = cnt.merge(number, -1, Integer::sum);
        freq.merge(c, 1, Integer::sum);
    }

    public boolean hasFrequency(int frequency) {
        return freq.getOrDefault(frequency, 0) > 0;
    }
}

相关文章

  • leetcode--刷题策略

    数据据结构与算法: 按分类来刷leetcode的题,一开始刷的时候先找经典的题--即频率高的题目 然后一题多练,经...

  • 【算法】二叉树遍历算法总结:前序中序后序遍历

    前言 二叉树遍历是非常经典的算法题,也是二叉树的一道基础算法题。 但是在平常的笔试面试中,其出现的频率其实并不是特...

  • Android面经| 算法题解

    整理了校招面试算法题,部分《剑指offer》算法题,以及LeetCode算法题,本博文中算法题均使用Java实现校...

  • 15道使用频率极高的基础算法题

    1、合并排序,将两个已经排序的数组合并成一个数组,其中一个数组能容下两个数组的所有元素; 2、合并两个已经排序的单...

  • 面试题高频算法题整理

    以下算法题几乎都是简单题,都为面试算法题值得刷的题,需要理解并记住解题思路,而其中★标注的题,更是面试算法题中的高...

  • 回溯,贪心,动态规划

    1.回溯算法思想leetcode 112 号算法题:路径总和leetcode 113 号算法题:路径总和 IIle...

  • java基础-String类API

    在java基本API中,String类出现的频率极高,很多大公司的算法题都是基于字符串的,所以今天对java中的S...

  • Guava-RateLimiter详解

    常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶...

  • 干货分享:2018年百度算法集锦,让您更懂搜索营销

    2018年初至今百度已有四次算法更新:清风算法2.0、烽火算法2.0、惊雷算法2.0、细雨算法,如此高频率更新进一...

  • Zuul 网关限流---Guava RateLimiter

    限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法也就是以固定的频率向桶中放入令...

网友评论

      本文标题:【算法题】6417. 频率跟踪器

      本文链接:https://www.haomeiwen.com/subject/ezshsdtx.html