10. Longest Subarray With Majority Greater Than K
The problem can be found at the following link: 🔗 Question Link
🧩 Problem Description
Given an array arr[] of size n and an integer k, find the length of the longest subarray in which the count of elements greater than k is strictly more than the count of elements less than or equal to k.
📘 Examples
Example 1:
Input:
arr = [1, 2, 3, 4, 1], k = 2Output:
3Explanation:
Subarrays [2, 3, 4] or [3, 4, 1] both have 2 elements > 2 and 1 element ≤ 2.
Example 2:
Input:
arr = [6, 5, 3, 4], k = 2Output:
4Explanation:
Full array has 4 elements > 2 and 0 elements ≤ 2, so length = 4.
🔒 Constraints
$
1 ≤ n = arr.size() ≤ 10^6$$
0 ≤ k ≤ 10^6$$
0 ≤ arr[i] ≤ 10^6$
✅ My Approach
Prefix‐Sum + Hash Map
We transform each element into +1 if it’s > k, or −1 otherwise. Then the problem reduces to finding the longest subarray whose sum is positive.
Algorithm Steps:
Initialize a prefix‐sum
s = 0and an empty hash mapfirstIdxmapping each seen prefix‐sum to its earliest index.Iterate through the array with index
i:Update
s += (arr[i] > k ? 1 : -1).If
s > 0, the subarray[0…i]has positive sum; updateres = i + 1.Else if
(s - 1)exists infirstIdx, a subarray ending atistarting afterfirstIdx[s - 1]has positive sum; updateres = max(res, i - firstIdx[s - 1]).If
sis not yet infirstIdx, storefirstIdx[s] = i.
Return
res(the maximum length found).
🧮 Time and Auxiliary Space Complexity
Expected Time Complexity:
O(n), since we make a single pass and each hash operation is amortized O(1).Expected Auxiliary Space Complexity:
O(n), for storing up tondistinct prefix‐sums in the hash map.
🧠 Code (C++)
class Solution {
public:
int longestSubarray(vector<int>& arr, int k) {
unordered_map<int,int> firstIdx;
int s = 0, res = 0;
for (int i = 0; i < arr.size(); ++i) {
s += (arr[i] > k ? 1 : -1);
if (s > 0) {
res = i + 1;
} else {
if (!firstIdx.count(s)) firstIdx[s] = i;
if (firstIdx.count(s - 1))
res = max(res, i - firstIdx[s - 1]);
}
}
return res;
}
};🧑💻 Code (Java)
class Solution {
public int longestSubarray(int[] arr, int k) {
Map<Integer,Integer> firstIdx = new HashMap<>();
int s = 0, res = 0;
for (int i = 0; i < arr.length; i++) {
s += arr[i] > k ? 1 : -1;
if (s > 0) {
res = i + 1;
} else {
firstIdx.putIfAbsent(s, i);
if (firstIdx.containsKey(s - 1)) {
res = Math.max(res, i - firstIdx.get(s - 1));
}
}
}
return res;
}
}🐍 Code (Python)
class Solution:
def longestSubarray(self, arr, k):
first_idx = {}
s = res = 0
for i, val in enumerate(arr):
s += 1 if val > k else -1
if s > 0:
res = i + 1
else:
first_idx.setdefault(s, i)
if (s - 1) in first_idx:
res = max(res, i - first_idx[s - 1])
return res🧠 Contribution and Support
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: 📬 Any Questions?. Let’s make this learning journey more collaborative!
⭐ If you find this helpful, please give this repository a star! ⭐
📍Visitor Count
Last updated