Advertisement

All O`one Data Structure - LeetCode 432 Solution

All O`one Data Structure - Complete Solution Guide

All O`one Data Structure is LeetCode problem 432, a Hard level challenge. This complete guide provides step-by-step explanations, multiple solution approaches, and optimized code in python3, java, cpp, c.

Problem Statement

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 t

Detailed Explanation

The problem requires designing a data structure called `AllOne` that efficiently stores the counts of strings and allows retrieval of strings with the maximum and minimum counts in O(1) time. The data structure should support incrementing the count of a given string, decrementing the count of a string, and removing the string if its count becomes zero. The constraints limit the key length to 10 lowercase English letters, guarantee that `dec` is only called on existing keys, and restrict the total number of calls to the methods to 5 * 10^4.

Solution Approach

The solution utilizes a combination of a doubly-linked list and a hash map. The doubly-linked list stores nodes (buckets), each representing a specific count. Each node holds a set of keys sharing the same count. The hash map maps each key to its corresponding node in the doubly-linked list. Incrementing a key involves moving it to the next higher count node, creating a new node if necessary. Decrementing involves moving it to the next lower count node or removing the key and node if the count becomes zero. `getMaxKey()` and `getMinKey()` simply return a key from the tail and head of the linked list respectively, achieving O(1) time complexity.

Step-by-Step Algorithm

  1. Step 1: Initialize the `AllOne` data structure with a doubly-linked list with head and tail dummy nodes, and an empty hash map `key_to_node`.
  2. Step 2: Implement the `inc(key)` method: If the key exists in the `key_to_node` map, get its current node. Otherwise, set the current node to the head.
  3. Step 3: Increment the count and move the key to the appropriate bucket. If a bucket with the incremented count does not exist, create one.
  4. Step 4: Update the `key_to_node` map with the new node for the key.
  5. Step 5: Implement the `dec(key)` method: Get the current node of the key from `key_to_node`. Decrement the count and move the key to the appropriate bucket. If the new count is 0, remove the key.
  6. Step 6: If the count becomes zero, remove the entry from the keyToNode map. Otherwise update the mapping.
  7. Step 7: Implement `getMaxKey()` by returning a key from the node before the tail. If the list is empty return an empty string.
  8. Step 8: Implement `getMinKey()` by returning a key from the node after the head. If the list is empty return an empty string.

Key Insights

  • Insight 1: Maintaining a doubly-linked list of buckets, where each bucket stores keys with the same count, allows for O(1) access to minimum and maximum counts.
  • Insight 2: A hash map mapping keys to their respective nodes in the linked list enables O(1) increment and decrement operations.
  • Insight 3: Correctly handling edge cases such as an empty AllOne data structure or the first or last node being updated is crucial for correct functionality.

Complexity Analysis

Time Complexity: O(1)

Space Complexity: O(n)

Topics

This problem involves: Hash Table, Linked List, Design, Doubly-Linked List.

Companies

Asked at: Airbnb, Atlassian, LinkedIn, Media.net, Nextdoor.