You are given an integer array nums of length n and an integer k.
An index i is a peak if:
0 < i < n - 1nums[i] > nums[i - 1] and nums[i] > nums[i + 1]A subarray [l, r] is valid if:
i from numsi - l <= k and r - i <= kReturn an integer denoting the number of valid subarrays in nums.
Example 1:
Input: nums = [1,3,2], k = 1
Output: 4
Explanation:
i = 1 is a peak because nums[1] = 3 is greater than nums[0] = 1 and nums[2] = 2.k = 1.[3], [1, 3], [3, 2], and [1, 3, 2], so the answer is 4.Example 2:
Input: nums = [7,8,9], k = 2
Output: 0
Explanation:
i such that nums[i] is greater than both nums[i - 1] and nums[i + 1].Example 3:
Input: nums = [4,3,5,1], k = 2
Output: 6
Explanation:
i = 2 is a peak because nums[2] = 5 is greater than nums[1] = 3 and nums[3] = 1.k = 2.[5], [3, 5], [5, 1], [3, 5, 1], [4, 3, 5], and [4, 3, 5, 1], so the answer is 6.
Constraints:
1 <= n == nums.length <= 105-105 <= nums[i] <= 1051 <= k <= nProblem Overview: You are given an array and need to count subarrays that contain exactly one peak. A peak is an element nums[i] such that nums[i-1] < nums[i] > nums[i+1]. The challenge is efficiently checking every possible subarray while ensuring the peak count is exactly one.
Approach 1: Brute Force Enumeration (O(n^3) time, O(1) space)
The most direct method is to generate every possible subarray using two nested loops and then scan the subarray to count peaks. For each candidate subarray [l, r], iterate through its internal indices and check the peak condition nums[i-1] < nums[i] > nums[i+1]. If the count of peaks equals one, increment the answer. This approach is simple but inefficient because each subarray requires another scan, resulting in O(n^3) time.
Approach 2: Simulation with Running Peak Count (O(n^2) time, O(1) space)
A more practical solution still enumerates subarrays but avoids rescanning them repeatedly. Fix a starting index l, then expand the right boundary r one step at a time. As the window grows, only one new candidate position can become a peak. Update a running peak counter whenever the new element completes a nums[i-1] < nums[i] > nums[i+1] pattern. If the peak count becomes greater than one, you can stop expanding that subarray early because any longer subarray will also contain more than one peak. This pruning keeps the approach manageable and results in O(n^2) time with constant space.
Approach 3: Precomputed Peak Array + Simulation (O(n^2) time, O(n) space)
You can precompute an auxiliary array where peak[i] indicates whether index i is a peak. This preprocessing takes O(n) time. When enumerating subarrays, you only check whether the new index contributes a peak by consulting the array instead of recomputing the comparison each time. The enumeration logic stays the same, but peak detection becomes a constant-time lookup. This version trades a small amount of memory for slightly cleaner logic and faster constant factors.
These strategies rely on careful iteration and condition checks, making them good practice for problems involving array patterns and window expansion. The logic is closely related to common techniques used in arrays, simulation, and prefix-style preprocessing often seen in prefix sum problems.
Recommended for interviews: The simulation with running peak count approach is the expected solution. Starting with the brute-force explanation shows you understand the definition of a peak and the structure of the search space. Transitioning to the O(n^2) incremental simulation demonstrates optimization skills by avoiding redundant scans and applying early stopping once multiple peaks appear.
We first traverse the array to find all peak positions and store them in a list peaks.
For each peak position, we calculate the left and right boundaries centered at the peak with a distance not exceeding k. Note that if there are multiple peaks, we need to ensure the calculated subarray does not contain other peaks. Then, based on the left and right boundaries, we calculate the number of valid subarrays centered at each peak and accumulate it into the answer.
The time complexity is O(n), and the space complexity is O(n), where n is the length of the array.
Python
Java
C++
Go
TypeScript
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Brute Force Enumeration | O(n^3) | O(1) | Useful for understanding the peak definition and validating logic on small inputs |
| Simulation with Running Peak Count | O(n^2) | O(1) | General case solution; avoids rescanning subarrays and allows early stopping |
| Precomputed Peak Array + Simulation | O(n^2) | O(n) | When you want cleaner peak checks with constant-time lookups |
Practice Valid Subarrays With Exactly One Peak with our built-in code editor and test cases.
Practice on FleetCodePractice this problem
Open in Editor