BackmediumBinary SearchSwiggyPhonePe

Kth Maximum Partition Analyzer 2 Solution

Problem Statement

You are provided with an array arr of integers representing a sequence of system load metrics. A partition is defined by selecting an index i such that the subarray arr[0...i] is strictly increasing and the subarray arr[i...n-1] is strictly decreasing. The value of such a partition is defined as the element at the peak index i.

Your task is to determine the k-th largest partition value among all valid partitions in the array. If there are fewer than k valid partitions, return -1. Note that a valid partition requires the peak element to be strictly greater than its immediate neighbors (if they exist). For the boundaries, arr[0] can be a peak if arr[0] > arr[1], and arr[n-1] can be a peak if arr[n-1] > arr[n-2].

Input: An integer array arr and an integer k. Output: The k-th largest value among all valid peak elements, or -1 if not enough peaks exist.

Example 1
Input
arr = [1, 3, 2, 5, 4, 6, 3], k = 2
Output
5

Explanation: Identify all valid peaks: 1. Index 1: arr[1]=3, neighbors 1 and 2. 3>1 and 3>2. Valid. Value: 3. 2. Index 3: arr[3]=5, neighbors 2 and 4. 5>2 and 5>4. Valid. Value: 5. 3. Index 5: arr[5]=6, neighbors 4 and 3. 6>4 and 6>3. Valid. Value: 6. List of peak values: [3, 5, 6]. Sorted in descending order: [6, 5, 3]. The 2nd largest value is 5.

Example 2
Input
arr = [10, 9, 8, 7], k = 1
Output
10

Explanation: Identify all valid peaks: 1. Index 0: arr[0]=10, right neighbor 9. 10>9. Valid (boundary peak). Value: 10. 2. Index 1: arr[1]=9, neighbors 10 and 8. 9<10. Invalid. 3. Index 2: arr[2]=8, neighbors 9 and 7. 8<9. Invalid. 4. Index 3: arr[3]=7, left neighbor 8. 7<8. Invalid. List of peak values: [10]. Sorted in descending order: [10]. The 1st largest value is 10.

Example 3
Input
arr = [1, 2, 3, 4, 5], k = 1
Output
5

Explanation: Identify all valid peaks: 1. Index 0: arr[0]=1, right neighbor 2. 1<2. Invalid. 2. Index 1: arr[1]=2, neighbors 1 and 3. 2<3. Invalid. 3. Index 2: arr[2]=3, neighbors 2 and 4. 3<4. Invalid. 4. Index 3: arr[3]=4, neighbors 3 and 5. 4<5. Invalid. 5. Index 4: arr[4]=5, left neighbor 4. 5>4. Valid (boundary peak). Value: 5. List of peak values: [5]. Sorted in descending order: [5]. The 1st largest value is 5.

Example 4
Input
arr = [5, 5, 5, 5], k = 1
Output
-1

Explanation: Identify all valid peaks: 1. Index 0: arr[0]=5, right neighbor 5. 5 is not strictly greater than 5. Invalid. 2. Index 1: arr[1]=5, neighbors 5 and 5. 5 is not strictly greater than 5. Invalid. 3. Index 2: arr[2]=5, neighbors 5 and 5. 5 is not strictly greater than 5. Invalid. 4. Index 3: arr[3]=5, left neighbor 5. 5 is not strictly greater than 5. Invalid. List of peak values: []. Since there are 0 valid peaks and k=1, return -1.

Constraints

  • 1 <= arr.length <= 10^5
  • 1 <= arr[i] <= 10^9
  • 1 <= k <= arr.length
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Kth Maximum Partition Analyzer 2 — Problem Statement & Solution Guide

Binary SearchMediumSearch Peak Element
TimeO(n log k) (or O(n) with nth_element)
|
SpaceO(k) (or O(1) extra if using nth_element)

Problem Description

You are provided with an array arr of integers representing a sequence of system load metrics. A partition is defined by selecting an index i such that the subarray arr[0...i] is strictly increasing and the subarray arr[i...n-1] is strictly decreasing. The value of such a partition is defined as the element at the peak index i.

Your task is to determine the k-th largest partition value among all valid partitions in the array. If there are fewer than k valid partitions, return -1. Note that a valid partition requires the peak element to be strictly greater than its immediate neighbors (if they exist). For the boundaries, arr[0] can be a peak if arr[0] > arr[1], and arr[n-1] can be a peak if arr[n-1] > arr[n-2].

Input: An integer array arr and an integer k.

Output: The k-th largest value among all valid peak elements, or -1 if not enough peaks exist.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Kth Maximum Partition Analyzer 2"

medium

WHY DOES IT MATTER?

Identifying peaks in a bitonic sequence is a classic example of the "peak‑finding" pattern, which underpins many interview questions involving monotonicity and binary search. Mastering this pattern equips candidates to solve problems that require efficient detection of local maxima or global extrema in large datasets.

OPTIMIZATION CHALLENGE

The key insight is that a peak can be verified with only its immediate neighbors, allowing a single linear pass to collect all candidates. Coupling this with a selection algorithm (nth_element) or a min‑heap reduces the overall time from quadratic to linear or near‑linear, and space from O(n) to O(k).

REAL-WORLD CONNECTION

In distributed systems, monitoring CPU or memory usage often involves detecting load spikes (peaks) that trigger auto‑scaling. Efficient peak detection ensures timely scaling decisions without scanning the entire history, analogous to finding k‑th largest peaks in an array.

When explaining your solution, emphasize that you first reduce the problem to a simple scan for peaks, then apply a linear‑time selection to avoid sorting the entire list. This two‑step approach demonstrates both algorithmic insight and practical efficiency.

COMPLEXITY AT A GLANCE

⏱ Time:O(n log k) (or O(n) with nth_element)
💾 Space:O(k) (or O(1) extra if using nth_element)

Core Theory — Why This Approach?

The problem reduces to identifying all indices that can serve as a peak in a bitonic subarray – an index i where the prefix up to i is strictly increasing and the suffix from i is strictly decreasing. A naive approach would examine every possible i and for each check the two monotonic conditions in O(n), leading to O(n^2) time. Instead, we can scan the array once to collect all valid peaks in O(n) time, because the monotonicity of the prefix and suffix can be verified locally: for interior indices i, the condition arr[i-1] < arr[i] > arr[i+1] suffices; for the ends, we only need to check the single adjacent element. Once we have the list of peak values, the k‑th largest can be found by sorting the list in descending order (O(m log m)) or by maintaining a min‑heap of size k (O(n log k)). A more sophisticated binary‑search‑on‑value solution is also possible: binary‑search over the value range [min(arr), max(arr)] and count how many peaks are ≥ mid in O(n) per iteration, yielding O(n log V) time where V is the value range. The optimal paradigm combines a linear scan for peak detection with a linear‑time selection algorithm (nth_element) or a heap to achieve O(n) time and O(1) extra space beyond the input.

Interview Questions on This Problem

Q1At Google, how would you explain the difference between a bitonic array and a general array when searching for a peak?

A bitonic array first strictly increases and then strictly decreases, guaranteeing a single global maximum. In a general array, peaks can be multiple and scattered; thus, a simple binary search for a peak works only on bitonic arrays, whereas in general arrays we must scan or use a modified algorithm that checks neighbors.

Q2In a fintech platform interview, you’re asked to find the k-th largest peak in a time‑series of stock prices. What data structure would you use to keep track of the top k peaks efficiently?

A min‑heap of size k is ideal: as we identify each peak, we push its value onto the heap; if the heap exceeds size k, we pop the smallest. This keeps only the k largest peaks in O(n log k) time and O(k) space.

Q3A startup’s interview focuses on scalability. How would you modify the algorithm to handle a stream of incoming load metrics where peaks must be updated in real time?

Maintain two deques for the increasing and decreasing parts of the current window. As new metrics arrive, adjust the deques to preserve monotonicity, and update a min‑heap of top k peaks. This allows O(1) amortized updates per element and constant‑time retrieval of the k‑th largest peak.

Examples

Example 1

Input

arr = [1, 3, 2, 5, 4, 6, 3], k = 2

Output

5

Explanation: Identify all valid peaks: 1. Index 1: arr[1]=3, neighbors 1 and 2. 3>1 and 3>2. Valid. Value: 3. 2. Index 3: arr[3]=5, neighbors 2 and 4. 5>2 and 5>4. Valid. Value: 5. 3. Index 5: arr[5]=6, neighbors 4 and 3. 6>4 and 6>3. Valid. Value: 6. List of peak values: [3, 5, 6]. Sorted in descending order: [6, 5, 3]. The 2nd largest value is 5.

Example 2

Input

arr = [10, 9, 8, 7], k = 1

Output

10

Explanation: Identify all valid peaks: 1. Index 0: arr[0]=10, right neighbor 9. 10>9. Valid (boundary peak). Value: 10. 2. Index 1: arr[1]=9, neighbors 10 and 8. 9<10. Invalid. 3. Index 2: arr[2]=8, neighbors 9 and 7. 8<9. Invalid. 4. Index 3: arr[3]=7, left neighbor 8. 7<8. Invalid. List of peak values: [10]. Sorted in descending order: [10]. The 1st largest value is 10.

Example 3

Input

arr = [1, 2, 3, 4, 5], k = 1

Output

5

Explanation: Identify all valid peaks: 1. Index 0: arr[0]=1, right neighbor 2. 1<2. Invalid. 2. Index 1: arr[1]=2, neighbors 1 and 3. 2<3. Invalid. 3. Index 2: arr[2]=3, neighbors 2 and 4. 3<4. Invalid. 4. Index 3: arr[3]=4, neighbors 3 and 5. 4<5. Invalid. 5. Index 4: arr[4]=5, left neighbor 4. 5>4. Valid (boundary peak). Value: 5. List of peak values: [5]. Sorted in descending order: [5]. The 1st largest value is 5.

Example 4

Input

arr = [5, 5, 5, 5], k = 1

Output

-1

Explanation: Identify all valid peaks: 1. Index 0: arr[0]=5, right neighbor 5. 5 is not strictly greater than 5. Invalid. 2. Index 1: arr[1]=5, neighbors 5 and 5. 5 is not strictly greater than 5. Invalid. 3. Index 2: arr[2]=5, neighbors 5 and 5. 5 is not strictly greater than 5. Invalid. 4. Index 3: arr[3]=5, left neighbor 5. 5 is not strictly greater than 5. Invalid. List of peak values: []. Since there are 0 valid peaks and k=1, return -1.

Constraints

  • 1 <= arr.length <= 10^5
  • 1 <= arr[i] <= 10^9
  • 1 <= k <= arr.length

Optimal Approach & Strategy

Scan the array once to identify all peaks using only neighbor comparisons. Then use a min‑heap of size k or nth_element to find the k‑th largest peak in O(n log k) or O(n) time, respectively.

Brute Force Approach

Check every index i and for each, verify the increasing and decreasing conditions by scanning the entire prefix and suffix. Collect all valid peak values and then sort them to find the k‑th largest.

Verified Code Solutions

JavaScript Solution
Time: O(n log k) (or O(n) with nth_element)
function solution(nums, k) {
      nums.sort((a, b) => b - a);
      let max = nums[k - 1];
      let sum = 0;
      for (let num of nums) {
         if (num <= max) {
            sum += num;
         }
      }
      return sum;
   }

Asked in Top Tech Interviews

SwiggyPhonePe

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.