Group 1: Basic Frequency Counting & Existence Checks
This group introduces the most fundamental use of hash maps: counting element occurrences or checking for their existence. Problems start with simple counting and progress to using maps to track state across more complex data structures like a 2D grid.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
1 | Find All Duplicates in an Array | Link | Frequency Counting | Base case: Use a hash map to count integer occurrences and identify those that appear twice. |
2 | Rabbits in Forest | Link | Frequency Counting | Adds a layer of logic on top of frequency counts. You must interpret the counts according to the problem’s grouping rules. |
3 | Bulls and Cows | Link | Frequency Counting | Requires two passes or a single clever pass. Introduces managing two types of counts (bulls vs. cows) based on character and position. |
4 | K-diff Pairs in an Array | Link | Frequency Counting | Builds on counting by requiring a second pass over the map’s keys to find pairs that satisfy a specific condition (difference of k). |
5 | Valid Sudoku | Link | Existence Check (Hash Set) | Applies the existence check pattern to a 2D grid. Requires managing 27 different sets (9 rows, 9 columns, 9 boxes) simultaneously. |
6 | Set Matrix Zeroes | Link | State Tracking (Hash Set) | Uses hash sets not for counting, but to store the rows and columns that need to be modified, separating the “finding” and “setting” phases. |
7 | Subdomain Visit Count | Link | Frequency Counting | Adds significant string parsing logic. You must first process the input strings into subdomains before applying the counting pattern. |
8 | Finding the Users Active Minutes | Link | Frequency Counting | Involves a nested data structure: a hash map where each value is a hash set, to count unique minutes per user. |
9 | Display Table of Food Orders in a Restaurant | Link | Frequency Counting | Requires managing nested counts (table -> food item -> count). Adds complexity of collecting all keys for table headers and sorting. |
Group 2: Grouping by Canonical Representation
These problems use a hash map to group items. The key to the map is a “canonical” (standard) representation of an item, and the value is a list of all items that map to that key.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
10 | Group Anagrams | Link | Grouping | Foundational grouping problem. The canonical key is the sorted version of a string. |
11 | Find and Replace Pattern | Link | Grouping / Pattern Matching | Introduces a more complex canonical key. You need to normalize each word into a numeric pattern (e.g., ‘abb’ -> ‘122’) to group them. |
12 | Groups of Special-Equivalent Strings | Link | Grouping | A variation on the canonical key concept. The key must represent the counts of characters at both even and odd indices separately. |
13 | Determine if Two Strings Are Close | Link | Frequency Map Comparison | Instead of grouping, you create two frequency maps and compare them based on two conditions: same keys and same frequency values. |
14 | Word Subsets | Link | Frequency Map Comparison | Requires creating a single “max frequency” map from one list of words and then comparing each word from another list against it. |
15 | Find Duplicate File in System | Link | Grouping | Adds string parsing to extract file content, which serves as the canonical key for grouping file paths. |
Group 3: Frequency Counting with Sorting or Greedy Logic
Here, the hash map is the first step in a two-step process. After counting frequencies, you must apply a sorting or greedy algorithm to the counts to find the answer.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
16 | Sort Characters by Frequency | Link | Frequency Count & Sort | Base case: Count character frequencies, then sort the characters based on those counts to build the result string. |
17 | Top K Frequent Elements | Link | Frequency Count & Heap/Sort | Similar to the previous, but introduces finding the “top K” elements, making a Min-Heap or Quickselect an efficient follow-up step. |
18 | Top K Frequent Words | Link | Frequency Count & Heap/Sort | A “boring variation” that adds complexity to the sorting logic: you must handle ties using lexicographical order. |
19 | Reduce Array Size to the Half | Link | Frequency Count & Greedy | Introduces a greedy approach. After counting, you sort the frequencies and greedily remove the largest counts to solve the problem. |
20 | Least Number of Unique Integers after K Removals | Link | Frequency Count & Greedy | Similar greedy logic, but now you remove the smallest counts first. Reinforces the pattern of operating on sorted frequencies. |
21 | Hand of Straights | Link | Frequency Count & Greedy | Requires more complex greedy logic. After counting, you must check for consecutive sequences, often by iterating through sorted keys. |
22 | Divide Array in Sets of K Consecutive Numbers | Link | Frequency Count & Greedy | A “boring variation” of Hand of Straights. The underlying logic is identical. |
23 | Reorganize String | Link | Frequency Count & Greedy Heap | The greedy logic becomes more complex, requiring a Max-Heap to always pick the most frequent character that is not adjacent to the last. |
24 | Distant Barcodes | Link | Frequency Count & Greedy Heap | A “boring variation” of Reorganize String with the same underlying greedy heap-based algorithm. |
Group 4: Modulo Arithmetic & Pair/Tuple Counting
This set of problems combines frequency maps with modulo arithmetic or number theory to find pairs or combinations that satisfy a specific sum or divisibility property.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
25 | Pairs of Songs with Total Durations Divisible by 60 | Link | Hashing with Modulo | Foundational problem for this pattern. Use a map to store counts of time % 60 to find complementary pairs. |
26 | Check if Array Pairs Are Divisible by k | Link | Hashing with Modulo | A “boring variation” of the previous problem, generalizing the logic from a fixed 60 to a variable k . |
27 | 4Sum II | Link | Hashing Pairs (Two-Sum) | Applies the two-sum pattern on a larger scale. You pre-compute and store sums of pairs from two arrays in a map to find -(c+d) . |
28 | Number of Pairs of Interchangeable Rectangles | Link | Hashing with Ratios | Uses a map to count occurrences of a canonical key, which is the reduced fraction (ratio) of width to height. |
29 | Count Good Meals | Link | Hashing Pairs (Two-Sum) | A variation of Two-Sum where the target isn’t fixed. For each number, you must check for complements for all possible powers of two. |
30 | Tuple with Same Product | Link | Hashing Pairs | Uses a hash map to count the frequency of products of pairs. The final calculation requires combinatorial logic (nC2). |
Group 5: Sliding Window with Hash Maps
In these problems, a hash map is used to maintain the state of a “sliding window” as it moves across an array or string. This is a powerful and common pattern.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
31 | Longest Substring Without Repeating Characters | Link | Sliding Window | The classic introduction to using a map in a sliding window to track characters and their last seen positions. |
32 | Fruit Into Baskets | Link | Sliding Window | A slight variation where the window’s constraint is having at most 2 distinct character types (fruits). |
33 | Permutation in String | Link | Sliding Window (Fixed) | Introduces a fixed-size window. Requires two maps: one for the target string and one for the current window, which you compare. |
34 | Find All Anagrams in a String | Link | Sliding Window (Fixed) | A “boring variation” of the previous problem. Instead of returning true/false, you collect all starting indices of valid anagrams. |
35 | Maximum Erasure Value | Link | Sliding Window | Combines the unique-element window from “Longest Substring” with calculating a sum, rather than just the length of the window. |
36 | Longest Repeating Character Replacement | Link | Sliding Window | Introduces a more complex window condition: window_length - max_frequency <= k . Requires efficiently tracking the max frequency. |
37 | Find the Longest Substring Containing Vowels in Even Counts | Link | Sliding Window & Bitmask | Advanced pattern combining a hash map with bitmasking. The map stores mask -> first_index to find subarrays with a target parity state. |
Group 6: Prefix Sum with Hash Maps
This pattern is used to efficiently find subarrays or subsequences that sum to a specific target. A hash map stores prefix sums and their indices, allowing for O(1) lookups.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
38 | Subarray Sum Equals K | Link | Prefix Sum | The canonical problem for this pattern. You store counts of prefix sums in a map to find current_sum - k . |
39 | Binary Subarrays with Sum | Link | Prefix Sum | A “boring variation” of Subarray Sum Equals K, cementing the core concept. |
40 | Count Number of Nice Subarrays | Link | Prefix Sum | A re-framing of the same problem. You must first transform the input (odd=1, even=0) to see it as a standard subarray sum problem. |
41 | Contiguous Array | Link | Prefix Sum | Another re-framing. By converting 0s to -1s, the problem becomes finding the longest subarray with a sum of 0. |
42 | Subarray Sums Divisible by K | Link | Prefix Sum with Modulo | Combines the prefix sum pattern with modulo arithmetic. The map stores counts of prefix_sum % k . |
43 | Continuous Subarray Sum | Link | Prefix Sum with Modulo | A variation of the previous problem that requires checking for a subarray length of at least 2. |
44 | Minimum Operations to Reduce X to Zero | Link | Prefix Sum | Requires an insightful re-framing: the problem is equivalent to finding the longest middle subarray that sums to total_sum - x . |
45 | Remove Zero Sum Consecutive Nodes from Linked List | Link | Prefix Sum on Linked List | Applies the prefix sum pattern to a linked list. The map stores prefix_sum -> node , requiring pointer manipulation to remove sublists. |
Group 7: Graph/Tree Traversal with Hashing
In graph and tree problems, hash maps are essential for tracking visited nodes (to avoid cycles) or for mapping old nodes to new nodes when creating a deep copy.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
46 | Employee Importance | Link | Graph Traversal (DFS/BFS) | Base case: Use a hash map to build an adjacency list (id -> Employee ) for easy lookups, then perform a simple traversal (DFS or BFS) to sum values. |
47 | Linked List Cycle II | Link | Traversal & Visited Set | Uses a hash set to keep track of visited nodes in a linked list. The first repeated node found is the start of the cycle. |
48 | Clone Graph | Link | Graph Traversal & Cloning | The canonical graph cloning problem. A hash map (old_node -> new_node ) is crucial for tracking visited/cloned nodes to avoid infinite loops and re-creations. |
49 | Copy List with Random Pointer | Link | Graph Traversal & Cloning | A “boring variation” of Clone Graph applied to a linked list with an extra random pointer, reinforcing the old_node -> new_node map pattern. |
50 | Open the Lock | Link | BFS & Visited Set | A classic state-space search using BFS. A hash set is essential to store visited states (lock combinations) to prevent redundant exploration. |
51 | Minimum Genetic Mutation | Link | BFS & Visited Set | A “boring variation” of Open the Lock. The states are gene strings instead of numbers, but the BFS with a visited set pattern is identical. |
52 | Construct Binary Tree from Preorder and Inorder Traversal | Link | Recursion & Index Lookup | A hash map is used as a critical optimization to store value -> index for the inorder traversal, allowing O(1) lookup of the root’s position. |
53 | Construct Binary Tree from Inorder and Postorder Traversal | Link | Recursion & Index Lookup | A “boring variation” of the previous problem, using the same inorder map but with postorder traversal logic. |
54 | Restore the Array from Adjacent Pairs | Link | Graph Traversal | Requires building a graph (adjacency list via hash map) from pairs, finding an endpoint (a node with one neighbor), and then traversing to reconstruct. |
Group 8: Dynamic Programming with Hash Map Memoization
In these problems, a hash map is used as a “memo” to store the results of previously computed subproblems, which is the core of top-down dynamic programming.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
55 | Word Break | Link | DP with Memo | Classic DP problem. A hash set provides O(1) dictionary lookups, and a hash map can be used for memoization (index -> boolean ) to store subproblem results. |
56 | Delete and Earn | Link | DP with Memo | The first step is using a hash map to aggregate points for each number. The problem then becomes a “House Robber” variation on the sorted keys of the map. |
57 | Longest Arithmetic Subsequence of Given Difference | Link | DP with Memo | Introduces DP where the map state is value -> length . For each num , the length of the sequence is 1 + map[num - difference] . |
58 | Longest String Chain | Link | DP with Memo | The DP state is word -> longest_chain_length . Requires sorting the words by length and building the solution by checking predecessors of each word. |
59 | Binary Trees with Factors | Link | DP with Memo | The DP state is number -> count_of_trees . For each number, you iterate through its factors to calculate the total combinations. |
60 | Longest Arithmetic Subsequence | Link | DP with Memo | The DP state is more complex, requiring a nested map: dp[index][difference] . A map of maps (map<int, map<int, int>> ) is a natural fit for this. |
Group 9: Custom Data Structure Design
This group contains problems that require you to design and implement a class with specific methods and time complexities. A hash map is almost always the core component.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
61 | Encode and Decode TinyURL | Link | Design | The simplest design problem. Requires two hash maps for forward and reverse lookups (long->short and short->long ). |
62 | Insert Delete GetRandom O(1) | Link | Design | A classic design problem combining a hash map (value -> index ) with an array for O(1) average time complexity on all operations. |
63 | Time-Based Key-Value Store | Link | Design | Introduces combining a hash map with another structure. The map’s value is a sorted list of (timestamp, value) pairs, requiring binary search for get . |
64 | Design Underground System | Link | Design | Requires multiple hash maps to track different states: one for active check-ins and another to aggregate travel times between stations. |
65 | Snapshot Array | Link | Design | A clever design for versioning. Each array index contains a map (snap_id -> value ) or a sorted list to allow efficient historical lookups. |
66 | LRU Cache | Link | Design | A canonical design problem requiring a combination of a hash map (for O(1) lookups) and a doubly linked list (to manage recency). |
67 | Design Twitter | Link | Design | A more complex design involving multiple hash maps (userId -> follows , userId -> tweets ) and merging sorted lists or using a heap to generate the feed. |
68 | Stock Price Fluctuation | Link | Design | Combines a hash map for current prices with a sorted data structure (like a sorted map or two heaps) to efficiently track min and max prices. |
69 | Detect Squares | Link | Design | Requires storing point frequencies in a map. The count method involves iterating through existing points to find valid squares. |
Group 10: Clever Hashing & Miscellaneous Problems
This final group includes problems where the hash map is used in a particularly clever way, as a minor utility in a larger algorithm, or for complex state tracking.
# | Problem | Link | Concept | Description of Difficulty Increase |
---|---|---|---|---|
70 | Longest Consecutive Sequence | Link | Clever Hashing (Set) | A classic problem solved with a clever trick: use a hash set for O(1) lookups and only start counting a sequence from its true starting number. |
71 | Letter Combinations of a Phone Number | Link | Backtracking & Lookup | The hash map is used as a simple utility (a lookup table for digit -> letters ). The core logic is backtracking, not hashing. |
72 | Brick Wall | Link | Clever Hashing | The key insight is to use a hash map to count the frequency of “gaps” between bricks. The answer is total_rows - max_gap_frequency . |
73 | Fraction to Recurring Decimal | Link | Simulation & State | A complex simulation of long division. The hash map is critical for detecting a cycle by storing remainder -> position . |
74 | Prison Cells After N Days | Link | Simulation & Cycle Detection | Since the state space is small, cycles must occur. A hash map (state -> day ) is used to detect the cycle and calculate the final state. |
75 | Smallest Integer Divisible by K | Link | Math & Cycle Detection | Similar to the above, this problem uses a hash set to detect when a remainder % k repeats, which indicates a non-terminating sequence. |
76 | Partition Labels | Link | Greedy & Pre-computation | A two-pass greedy solution. The first pass uses a hash map to pre-compute the last occurrence index of every character. |
77 | Task Scheduler | Link | Greedy & Math | The hash map is used for initial frequency counting. The core logic is a mathematical or greedy approach to calculate idle time. |