LeetCode 题解工作台

频率跟踪器

请你设计并实现一个能够对其中的值进行跟踪的数据结构,并支持对频率相关查询进行应答。 实现 FrequencyTracker 类: FrequencyTracker() :使用一个空数组初始化 FrequencyTracker 对象。 void add(int number) :添加一个 number…

category

2

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

中等 · 哈希·表·结合·design

bolt

答案摘要

我们定义两个哈希表,其中 用于记录每个数字出现的次数,而 用于记录每个出现次数的数字的个数。 对于 `add` 操作,我们直接将哈希表 中 对应的值减一,然后将 加一,再将 对应的值加一。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 哈希·表·结合·design 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

实现 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
  • 最多调用 adddeleteOnehasFrequency 共计 2 * 105
lightbulb

解题思路

方法一:哈希表

我们定义两个哈希表,其中 cntcnt 用于记录每个数字出现的次数,而 freqfreq 用于记录每个出现次数的数字的个数。

对于 add 操作,我们直接将哈希表 freqfreqcnt[number]cnt[number] 对应的值减一,然后将 cnt[number]cnt[number] 加一,再将 freq[cnt[number]]freq[cnt[number]] 对应的值加一。

对于 deleteOne 操作,我们首先判断 cnt[number]cnt[number] 是否大于零,如果大于零,我们将哈希表 freqfreqcnt[number]cnt[number] 对应的值减一,然后将 cnt[number]cnt[number] 减一,再将 freq[cnt[number]]freq[cnt[number]] 对应的值加一。

对于 hasFrequency 操作,我们直接返回 freq[frequency]freq[frequency] 是否大于零。

时间复杂度方面,由于我们使用了哈希表,因此每个操作的时间复杂度均为 O(1)O(1)。空间复杂度 O(n)O(n),其中 nn 为不同的数字的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class FrequencyTracker:
    def __init__(self):
        self.cnt = defaultdict(int)
        self.freq = defaultdict(int)

    def add(self, number: int) -> None:
        self.freq[self.cnt[number]] -= 1
        self.cnt[number] += 1
        self.freq[self.cnt[number]] += 1

    def deleteOne(self, number: int) -> None:
        if self.cnt[number]:
            self.freq[self.cnt[number]] -= 1
            self.cnt[number] -= 1
            self.freq[self.cnt[number]] += 1

    def hasFrequency(self, frequency: int) -> bool:
        return self.freq[frequency] > 0


# Your FrequencyTracker object will be instantiated and called as such:
# obj = FrequencyTracker()
# obj.add(number)
# obj.deleteOne(number)
# param_3 = obj.hasFrequency(frequency)
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Check if the candidate correctly uses hash tables for efficient frequency management.

  • question_mark

    Evaluate the approach for handling multiple operations efficiently under large constraints.

  • question_mark

    Assess how the candidate tracks the frequency of frequencies to optimize the `hasFrequency` query.

warning

常见陷阱

外企场景
  • error

    Failing to handle cases where a number's frequency drops to zero after a delete operation.

  • error

    Using inefficient data structures that lead to time complexity issues with the large number of operations.

  • error

    Not correctly updating the frequency count in the second hash table for `hasFrequency` queries.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Track the frequency of multiple numbers with the ability to reset frequencies.

  • arrow_right_alt

    Support additional operations like `getMostFrequent()` to return the number with the highest frequency.

  • arrow_right_alt

    Design a version that supports querying for the least frequent number.

help

常见问题

外企场景

频率跟踪器题解:哈希·表·结合·design | LeetCode #2671 中等