432. All O`one Data Structure

09/18/2021

Leetcodearrow-up-right

Design a data structure to store the strings' count with the ability to return the strings with minimum and maximum counts.

Implement the AllOne class:

  • AllOne() Initializes the object of the data structure.

  • inc(String key) Increments the count of the string key by 1. If key does not exist in the data structure, insert it with count 1.

  • dec(String key) Decrements the count of the string key by 1. If the count of key is 0 after the decrement, remove it from the data structure. It is guaranteed that key exists in the data structure before the decrement.

  • getMaxKey() Returns one of the keys with the maximal count. If no element exists, return an empty string "".

  • getMinKey() Returns one of the keys with the minimum count. If no element exists, return an empty string "".

Example 1:

Input
["AllOne", "inc", "inc", "getMaxKey", "getMinKey", "inc", "getMaxKey", "getMinKey"]
[[], ["hello"], ["hello"], [], [], ["leet"], [], []]
Output
[null, null, null, "hello", "hello", null, "hello", "leet"]

Explanation
AllOne allOne = new AllOne();
allOne.inc("hello");
allOne.inc("hello");
allOne.getMaxKey(); // return "hello"
allOne.getMinKey(); // return "hello"
allOne.inc("leet");
allOne.getMaxKey(); // return "hello"
allOne.getMinKey(); // return "leet"

Constraints:

  • 1 <= key.length <= 10

  • key consists of lowercase English letters.

  • It is guaranteed that for each call to dec, key is existing in the data structure.

  • At most 5 * 104 calls will be made to inc, dec, getMaxKey, and getMinKey.

Basic Idea:

这道题目和LFU Cache有些类似,要实现 O(1) 的时间复杂度,可以使用一个doubly linked list来维持每个freq的顺序,当count +1 或者 -1 的时候,将key从原本freq对应的node中挪到前面或者后面的node中。Min和Max可以在head和tail中得到。和LFU那道题不同的是,这里不需要在相同freq的node之间实现LRU,逻辑上稍微简单一些。

Java Code:

Last updated