LeetCode Problem Workspace

Count Special Triplets

Count Special Triplets requires scanning an array while tracking counts of previous and next values efficiently with hashes.

category

3

Topics

code_blocks

6

Code langs

hub

3

Related

Practice Focus

Medium · Array scanning plus hash lookup

bolt

Answer-first summary

Count Special Triplets requires scanning an array while tracking counts of previous and next values efficiently with hashes.

Interview AiBox logo

Ace coding interviews with Interview AiBox guidance for Array scanning plus hash lookup

Try AiBox Copilotarrow_forward

Start by initializing frequency maps to track counts of each number before and after the current index. Iterate through the array, updating the maps and counting valid triplets using the formula freqPrev[val] * freqNext[val]. This approach leverages the array scanning plus hash lookup pattern to achieve efficient counting without nested loops.

Problem Statement

Given an integer array nums, a special triplet is a set of indices (i, j, k) such that i < j < k and nums[i] == nums[k] != nums[j]. Your task is to count all such triplets in the array.

Return the total number of special triplets present. Focus on efficiently scanning the array while using hash maps to track occurrences before and after each index.

Examples

Example 1

Input: nums = [6,3,6]

Output: 1

The only special triplet is (i, j, k) = (0, 1, 2) , where:

Example 2

Input: nums = [0,1,0,0]

Output: 1

The only special triplet is (i, j, k) = (0, 2, 3) , where:

Example 3

Input: nums = [8,4,2,8,4]

Output: 2

There are exactly two special triplets:

Constraints

  • 3 <= n == nums.length <= 105
  • 0 <= nums[i] <= 105

Solution Approach

Use Frequency Maps

Maintain two hash maps: freqPrev counts occurrences before the current index, freqNext counts occurrences after. For each middle index j, calculate freqPrev[nums[j]] * freqNext[nums[j]] to count triplets involving j.

Single Pass Array Scan

Scan the array from left to right once, updating freqPrev and decrementing freqNext as you go. This avoids nested loops and keeps time complexity manageable while following the array scanning plus hash lookup pattern.

Edge Cases and Initialization

Initialize freqNext with counts of all numbers first. Handle arrays where all numbers are unique or repeated carefully to prevent overcounting. Proper initialization is crucial to avoid off-by-one mistakes.

Complexity Analysis

Metric Value
Time Depends on the final approach
Space Depends on the final approach

Time complexity is O(n) with hash maps since each index is processed once. Space complexity is O(U) where U is the number of unique values in nums, as both freqPrev and freqNext store counts.

What Interviewers Usually Probe

  • Expect you to notice that nested loops will be too slow for large n and suggest a counting map.
  • Look for the use of separate maps for previous and next frequencies, hinting at array scanning plus hash lookup.
  • Be ready to explain how you handle indices and avoid double-counting triplets.

Common Pitfalls or Variants

Common pitfalls

  • Incorrectly updating freqPrev or freqNext leading to wrong counts.
  • Assuming nums[i] != nums[j] automatically implies nums[j] != nums[k], which may overcount.
  • Forgetting to initialize freqNext properly before scanning the array.

Follow-up variants

  • Count triplets where nums[i] + nums[j] == nums[k] using similar frequency maps.
  • Find quadruplets with a similar condition, extending the hash lookup to two levels.
  • Restrict triplets to contiguous subarrays, requiring sliding window plus frequency map.

FAQ

What is a special triplet in this problem?

A special triplet is a set of indices (i, j, k) such that i < j < k, nums[i] == nums[k], and nums[j] differs.

How do frequency maps help count triplets?

Frequency maps track occurrences before and after each index, letting you compute valid triplets without nested loops.

Can this approach handle large arrays efficiently?

Yes, using array scanning plus hash lookup ensures O(n) time, suitable for arrays up to 10^5 elements.

What common mistakes should I avoid?

Ensure correct initialization of freqNext, update freqPrev and freqNext properly, and avoid double-counting identical values.

Does this pattern generalize to other counting problems?

Yes, the array scanning plus hash lookup pattern is useful for problems involving counts of elements before and after a position.

terminal

Solution

Solution 1: Enumerate Middle Number + Hash Table

We can enumerate the middle number $\textit{nums}[j]$, and use two hash tables, $\textit{left}$ and $\textit{right}$, to record the occurrence counts of numbers to the left and right of $\textit{nums}[j]$, respectively.

1
2
3
4
5
6
7
8
9
10
11
class Solution:
    def specialTriplets(self, nums: List[int]) -> int:
        left = Counter()
        right = Counter(nums)
        ans = 0
        mod = 10**9 + 7
        for x in nums:
            right[x] -= 1
            ans = (ans + left[x * 2] * right[x * 2] % mod) % mod
            left[x] += 1
        return ans
Count Special Triplets Solution: Array scanning plus hash lookup | LeetCode #3583 Medium