Talentd
FleetCode
Make and follow sheets.Sign in

Count Frequency Staircase Subarrays I solution and explanation

Medium4 min read60.0% acceptanceUpdated 26 Oct 2026
Leetcode Weekly Contest 525 | Q3 - Count Frequency Staircase Subarrays I | 4094 | HashingKumar K [Amazon] · 29:27 · 2K viewsWatch on YouTube
3 more videos on this problem
  1. Leetcode Weekly Contest 525 | Q3 - Count Frequency Staircase Subarrays I | 4094 | HashingKumar K [Amazon] · 29:27 · 2K views
  2. Count Frequency Staircase Subarrays I | LeetCode 4094 | 2 ApproachesSanyam IIT Guwahati · 18:51 · 473 views
  3. Leetcode 4094 | Count Frequency Staircase Subarrays I | Leetcode weekly contest 525CodeWithMeGuys · 11:39 · 297 views
  4. LeetCode 4094. Count Frequency Staircase Subarrays I | Weekly Contest 525WiniQuest · 25:16 · 87 views

The problem

You are given an integer array nums.

Consider the distinct values of a subarray in the order in which they first appear.

If there are k distinct values, the subarray is called a frequency staircase if the first distinct value occurs exactly once, the second distinct value occurs exactly twice, and so on, with the kth distinct value occurring exactly k times.

Equivalently, the frequencies of the distinct values, in the order of their first occurrence, must be exactly 1, 2, 3, ..., k.

Return the number of frequency staircase subarrays in nums.

A subarray is a contiguous non-empty sequence of elements within an array.

The frequency of a value in a subarray is the number of times it occurs in that subarray.

Example 1:

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

Output: 9

Explanation:

Every single-element subarray has frequencies [1], and there are 6 of them. 3 longer subarrays also qualify:

Subarray Values by first appearance Frequencies
nums[0...2] = [5, 8, 8] 5, then 8 [1, 2]
nums[2...4] = [8, 2, 2] 8, then 2 [1, 2]
nums[0...5] = [5, 8, 8, 2, 2, 2] 5, then 8, then 2 [1, 2, 3]

So the answer is 6 + 3 = 9.

Example 2:

Input: nums = [6,6,9,9]

Output: 5

Explanation:

Every single-element subarray has frequencies [1], and there are 4 of them. 1 longer subarray also qualifies:

Subarray Values by first appearance Frequencies
nums[1...3] = [6, 9, 9] 6, then 9 [1, 2]

So the answer is 4 + 1 = 5.

Example 3:

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

Output: 8

Explanation:

Every single-element subarray has frequencies [1], and there are 6 of them. 2 longer subarrays also qualify:

Subarray Values by first appearance Frequencies
nums[1...3] = [3, 4, 4] 3, then 4 [1, 2]
nums[0...5] = [2, 3, 4, 4, 3, 4] 2, then 3, then 4 [1, 2, 3]

So the answer is 6 + 2 = 8.

Constraints:

  • 1 <= nums.length <= 1500
  • 1 <= nums[i] <= 105

Approach overview

Problem Overview: You are given an integer array and must count the subarrays that satisfy the frequency staircase condition. The count depends on how many times each value appears inside a contiguous window, so the core work is tracking frequencies correctly as you choose subarray boundaries.

Approach 1: Brute Force Enumeration (O(n^2) time, O(n) space)

Fix a start index, then extend the end index one element at a time. For each subarray, build a frequency map from scratch and check the staircase condition against it. This is the most direct translation of the problem statement, so it is the right first pass when you are still reading the constraints. The cost is that every subarray rebuilds its frequency map, which wastes work because neighboring subarrays share almost all of their elements.

Approach 2: Incremental Frequency Tracking (O(n^2) time, O(n) space)

Keep the same outer loop over start indices, but do not reset the map between end positions. When the end index advances, add one element to the frequency hash map and update the check in O(1). This removes the inner rebuild and cuts the constant factor sharply. Use this version when the condition can be verified from the frequency map alone, without scanning the window again. It is the version most candidates should write once the brute force is clear. For a deeper look at the underlying patterns, see hash table and sliding window problems.

Approach 3: Count-of-Counts Maintenance (O(n^2) time worst case, O(n) space)

Maintain two maps: one from value to its frequency in the current window, and one from frequency to how many distinct values have that frequency. Each extension updates both maps in O(1). Any property that depends on the multiset of frequencies, such as whether all frequencies match a staircase pattern, can then be answered without iterating over the window. This approach is worth the extra bookkeeping only when the check involves frequency shape rather than a single value's count. Pick it when you can state the condition in terms of how many values share each frequency.

Recommended for interviews: Interviewers expect you to start with the brute force, state its O(n^2) cost with the rebuild step, and then remove the rebuild with incremental updates. The brute force shows you understand the problem. The incremental version with O(1) checks shows you can optimize a counting problem without changing its correctness. Explain each map update out loud, because that is where most bugs appear.

The written solution for this problem is still being prepared. Try it yourself in the meantime.

Try solving it yourself

Complexity analysis

ApproachTimeSpaceWhen to Use
Brute Force EnumerationO(n^2) subarrays, each rebuilt in O(n), so O(n^3) worst caseO(n)Small inputs or first pass to confirm the condition
Incremental Frequency TrackingO(n^2)O(n)General case, the standard interview solution
Count-of-Counts MaintenanceO(n^2) worst case, O(1) per updateO(n)When the check depends on how many values share each frequency

Frequently asked questions

Count Frequency Staircase Subarrays I Python solution?

A Python solution uses a dictionary or collections.Counter for the frequency map, with nested loops over start and end indices. Update the counter as the end index moves and check the condition after each update. Python's dictionary operations are O(1) on average, so the overall runtime stays O(n^2).

Is Count Frequency Staircase Subarrays I easy or hard?

It is a medium-difficulty problem. The brute force is straightforward, but getting to an efficient version requires careful frequency bookkeeping. Most difficulty comes from keeping the map updates correct as the window grows.

How to solve Count Frequency Staircase Subarrays I in O(n^2)?

Loop over each start index, then loop over end indices from that start. Keep one frequency hash map across the inner loop and update it by adding the new element. Check the staircase condition after each update so no map is rebuilt.

What is the best approach for Count Frequency Staircase Subarrays I?

The best approach is incremental frequency tracking. Fix a start index, extend the end index, and update a frequency hash map in O(1) per step instead of rebuilding it. This gives O(n^2) time and O(n) space.

What data structure is used in Count Frequency Staircase Subarrays I?

A hash map is the main data structure, mapping each value to its count inside the current subarray. Some solutions add a second hash map from frequency to the number of values with that frequency, which allows constant-time condition checks.

What is the time complexity of Count Frequency Staircase Subarrays I?

The brute force solution runs in O(n^3) because it rebuilds a frequency map for each of the O(n^2) subarrays. The optimized incremental solution runs in O(n^2) time with O(n) extra space for the frequency map.

Is Count Frequency Staircase Subarrays I asked in coding interviews at Google, Amazon, or Meta?

This problem is listed under the General topic on FleetCode and does not have confirmed company tags in our data. Frequency counting over subarrays is a common interview pattern, so practicing the incremental hash map approach prepares you for similar questions at major tech companies.

Comments

Now write it yourselfClose this page and solve Count Frequency Staircase Subarrays I in the editor, without looking.
Practise Count Frequency Staircase Subarrays I