Count of Array elements greater than or equal to twice the Median of K trailing Array elements
Last Updated : 11 Oct, 2023
Given an array A[] of size greater than integer K, the task is to find the total number of elements from the array which are greater than or equal to twice the median of K trailing elements in the given array.
Examples:
Input: A[] = {10, 20, 30, 40, 50}, K = 3
Output: 1
Explanation:
Since K = 3, the only two elements to be checked are {40, 50}.
For 40, the median of 3 trailing numbers {10, 20, 30} is 20.
Since 40 = 2 * 20, 40 is counted.
For element 50 the median of 3 trailing numbers {20, 30, 40} is 30.
Since 50 < 2 * 30, so 50 is not counted.
Therefore, the answer is 1.
Input: A[] = {1, 2, 2, 4, 5}, K = 3
Output: 2
Explanation:
Since K = 3, the only two elements considered are {4, 5}.
For 4, the median of 3 trailing numbers {1, 2, 2} is 2.
Since 4 = 2 * 2, therefore, 4 is counted.
For 5 the median of 3 trailing numbers {2, 2, 4} is 2.
5 > 2 * 2, so 5 is counted.
Therefore, the answer is 2.
Naive Approach:
Follow the steps below to solve the problem:
- Iterate over the given array from K + 1 to the size of the array and for each element, add the previous K elements from the array.
- Then, find the median and check if the current element is equal to or exceeds twice the value of the median. If found to be true, increase the count.
- Finally. print the count.
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h> using namespace std; void solve( int n, int k, int input[]) { int count = 0; for ( int i = k; i < n; i++) { int temp[k]; for ( int j = 0; j < k; j++) { temp[j] = input[i - k + j]; } sort(temp, temp + k); int median; if (k % 2 == 0) { median = (temp[k / 2 - 1] + temp[k / 2]) / 2; } else { median = temp[k / 2]; } if (input[i] >= 2 * median) { count++; } } cout << count << endl; } int main() { int input[] = { 1, 2, 2, 4, 5 }; int n = sizeof input / sizeof input[0]; int k = 3; solve(n, k, input); return 0; } |
Java
import java.util.Arrays; public class MedianComparison { public static void solve( int n, int k, int [] input) { int count = 0 ; for ( int i = k; i < n; i++) { int [] temp = new int [k]; for ( int j = 0 ; j < k; j++) { temp[j] = input[i - k + j]; } Arrays.sort(temp); int median; if (k % 2 == 0 ) { median = (temp[k / 2 - 1 ] + temp[k / 2 ]) / 2 ; } else { median = temp[k / 2 ]; } if (input[i] >= 2 * median) { count++; } } System.out.println(count); } public static void main(String[] args) { int [] input = { 1 , 2 , 2 , 4 , 5 }; int n = input.length; int k = 3 ; solve(n, k, input); } } |
Python
def solve(n, k, input_array): count = 0 for i in range (k, n): temp = input_array[i - k:i] temp.sort() median = 0 if k % 2 = = 0 : median = (temp[k / / 2 - 1 ] + temp[k / / 2 ]) / 2 else : median = temp[k / / 2 ] if input_array[i] > = 2 * median: count + = 1 print (count) if __name__ = = "__main__" : input_array = [ 1 , 2 , 2 , 4 , 5 ] n = len (input_array) k = 3 solve(n, k, input_array) |
C#
using System; class Program { static void Solve( int n, int k, int [] input) { int count = 0; for ( int i = k; i < n; i++) { int [] temp = new int [k]; for ( int j = 0; j < k; j++) { temp[j] = input[i - k + j]; } Array.Sort(temp); int median; if (k % 2 == 0) { median = (temp[k / 2 - 1] + temp[k / 2]) / 2; } else { median = temp[k / 2]; } if (input[i] >= 2 * median) { count++; } } Console.WriteLine(count); } static void Main() { int [] input = { 1, 2, 2, 4, 5 }; int n = input.Length; int k = 3; Solve(n, k, input); } } |
Javascript
function solve(n, k, input) { let count = 0; for (let i = k; i < n; i++) { let temp = []; for (let j = 0; j < k; j++) { temp.push(input[i - k + j]); } temp.sort((a, b) => a - b); let median; if (k % 2 === 0) { median = (temp[k / 2 - 1] + temp[k / 2]) / 2; } else { median = temp[Math.floor(k / 2)]; } if (input[i] >= 2 * median) { count++; } } console.log(count); } let input = [1, 2, 2, 4, 5]; let n = input.length; let k = 3; solve(n, k, input); |
Time Complexity: O(N * K * log K), Where N is the size of the input array and sorting requires (K * log K).
Auxiliary Space: O(K), Where K is the size of the temp array.
Efficient Approach:
To optimize the above approach, the idea is to use frequency-counting and sliding window technique. Follow the steps below to solve the problem:
- Store the frequencies of the elements present in the first K indices.
- Iterate over the array from (k + 1)th index to the Nth index and for each iteration, decrease the frequency of the i – kth element where i is the current index of the previous K trailing elements and increase the frequency count of the current element.
- For each iteration obtain the value of the low median and high median which will be different if the K is even. Otherwise it will be the same.
- Initialize a count variable that will count the frequency. Whenever floor((k+1)/2) is reached, the count gives a low median and similarly when the count reaches to ceil((k+1)/2) then it gives high median.
- Then add both the low and high median value and check if the current value is greater than or equal to it or and accordingly update the answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h> using namespace std; const int N = 2e5; const int V = 500; void solve( int n, int d, int input[]) { int a[N]; int cnt[V + 1]; for ( int i = 0; i < n; ++i) a[i] = input[i]; int answer = 0; for ( int i = 0; i < d; ++i) cnt[a[i]]++; for ( int i = d; i <= n - 1; ++i) { int acc = 0; int low_median = -1, high_median = -1; for ( int v = 0; v <= V; ++v) { acc += cnt[v]; if (low_median == -1 && acc >= int ( floor ((d + 1) / 2.0))) low_median = v; if (high_median == -1 && acc >= int ( ceil ((d + 1) / 2.0))) high_median = v; } int double_median = low_median + high_median; if (a[i] >= double_median) answer++; cnt[a[i - d]]--; cnt[a[i]]++; } cout << answer << endl; } int main() { int input[] = { 1, 2, 2, 4, 5 }; int n = sizeof input / sizeof input[0]; int k = 3; solve(n, k, input); return 0; } |
C
#include <stdio.h> #include <math.h> const int N = 2e5; const int V = 500; void solve( int n, int d, int input[]) { int a[N]; int cnt[V + 1]; for ( int i = 0; i < n; ++i) a[i] = input[i]; int answer = 0; for ( int i = 0; i < d; ++i) cnt[a[i]]++; for ( int i = d; i <= n - 1; ++i) { int acc = 0; int low_median = -1, high_median = -1; for ( int v = 0; v <= V; ++v) { acc += cnt[v]; if (low_median == -1 && acc >= floor ((d + 1) / 2.0)) low_median = v; if (high_median == -1 && acc >= ceil ((d + 1) / 2.0)) high_median = v; } int double_median = low_median + high_median; if (a[i] >= double_median) answer++; cnt[a[i - d]]--; cnt[a[i]]++; } printf ( "%d" ,answer); } int main() { int input[] = { 1, 2, 2, 4, 5 }; int n = sizeof input / sizeof input[0]; int k = 3; solve(n, k, input); return 0; } |
Java
class GFG{ static int N = ( int ) 2e5; static int V = 500 ; static void solve( int n, int d, int input[]) { int []a = new int [N]; int []cnt = new int [V + 1 ]; for ( int i = 0 ; i < n; ++i) a[i] = input[i]; int answer = 0 ; for ( int i = 0 ; i < d; ++i) cnt[a[i]]++; for ( int i = d; i <= n - 1 ; ++i) { int acc = 0 ; int low_median = - 1 , high_median = - 1 ; for ( int v = 0 ; v <= V; ++v) { acc += cnt[v]; if (low_median == - 1 && acc >= ( int )(Math.floor((d + 1 ) / 2.0 ))) low_median = v; if (high_median == - 1 && acc >= ( int )(Math.ceil((d + 1 ) / 2.0 ))) high_median = v; } int double_median = low_median + high_median; if (a[i] >= double_median) answer++; cnt[a[i - d]]--; cnt[a[i]]++; } System.out.print(answer + "\n" ); } public static void main(String[] args) { int input[] = { 1 , 2 , 2 , 4 , 5 }; int n = input.length; int k = 3 ; solve(n, k, input); } } |
Python3
import math N = 200000 V = 500 def solve(n, d, input1): a = [ 0 ] * N cnt = [ 0 ] * (V + 1 ) for i in range (n): a[i] = input1[i] answer = 0 for i in range (d): cnt[a[i]] + = 1 for i in range (d, n): acc = 0 low_median = - 1 high_median = - 1 for v in range (V + 1 ): acc + = cnt[v] if (low_median = = - 1 and acc > = int (math.floor((d + 1 ) / 2.0 ))): low_median = v if (high_median = = - 1 and acc > = int (math.ceil((d + 1 ) / 2.0 ))): high_median = v double_median = low_median + high_median if (a[i] > = double_median): answer + = 1 cnt[a[i - d]] - = 1 cnt[a[i]] + = 1 print (answer) if __name__ = = "__main__" : input1 = [ 1 , 2 , 2 , 4 , 5 ] n = len (input1) k = 3 solve(n, k, input1) |
C#
using System; class GFG{ static int N = ( int ) 2e5; static int V = 500; static void solve( int n, int d, int []input) { int []a = new int [N]; int []cnt = new int [V + 1]; for ( int i = 0; i < n; ++i) a[i] = input[i]; int answer = 0; for ( int i = 0; i < d; ++i) cnt[a[i]]++; for ( int i = d; i <= n - 1; ++i) { int acc = 0; int low_median = -1, high_median = -1; for ( int v = 0; v <= V; ++v) { acc += cnt[v]; if (low_median == -1 && acc >= ( int )(Math.Floor((d + 1) / 2.0))) low_median = v; if (high_median == -1 && acc >= ( int )(Math.Ceiling((d + 1) / 2.0))) high_median = v; } int double_median = low_median + high_median; if (a[i] >= double_median) answer++; cnt[a[i - d]]--; cnt[a[i]]++; } Console.Write(answer + "\n" ); } public static void Main(String[] args) { int []input = { 1, 2, 2, 4, 5 }; int n = input.Length; int k = 3; solve(n, k, input); } } |
Javascript
<script> const N = 2e5; const V = 500; function solve(n, d, input) { let a = new Array(N); let cnt = new Array(V + 1); for (let i = 0; i < n; ++i) a[i] = input[i]; let answer = 0; for (let i = 0; i < d; ++i) cnt[a[i]]++; for (let i = d; i <= n - 1; ++i) { let acc = 0; let low_median = -1, high_median = -1; for (let v = 0; v <= V; ++v) { acc += cnt[v]; if (low_median == -1 && acc >= parseInt(Math.floor((d + 1) / 2.0))) low_median = v; if (high_median == -1 && acc >= parseInt(Math.ceil((d + 1) / 2.0))) high_median = v; } let double_median = low_median + high_median; if (a[i] >= double_median) answer++; cnt[a[i - d]]--; cnt[a[i]]++; } document.write(answer); } let input = [ 1, 2, 2, 4, 5 ]; let n = input.length; let k = 3; solve(n, k, input); </script> |
Time Complexity: O(N)
Auxiliary Space: O(N)
Similar Reads
Count the number of elements which are greater than any of element on right side of an array
Given an array Arr[]. The task is to count the number of elements Arr[i] in the given array such that one or more smaller elements are present on the right side of the element Arr[i] in array. Examples: Input: Arr[] = { 3, 9, 4, 6, 7, 5 } Output: 3Numbers that counts are: 9, 6, 7 9 - As all numbers
4 min read
Count K-length subarrays whose average exceeds the median of the given array
Given an array arr[] consisting of N integers and a positive integer K, the task is to find the number of subarrays of size K whose average is greater than its median and both the average, median must be either prime or non-prime. Examples: Input: arr[] = {2, 4, 3, 5, 6}, K = 3Output: 2Explanation:F
9 min read
Number of positions such that adding K to the element is greater than sum of all other elements
Given an array arr[] and a number K. The task is to find out the number of valid positions i such that (arr[i] + K) is greater than sum of all elements of array excluding arr[i].Examples: Input: arr[] = {2, 1, 6, 7} K = 4 Output: 1 Explanation: There is only 1 valid position i.e 4th. After adding 4
5 min read
Count triplets (i, j, k) in an array of distinct elements such that a[i] <a> a[k] and i < j < k
Given an array arr[] consisting of N distinct integers, the task is to count the number of triplets (i, j, k) possible from the array arr[] such that i < j < k and arr[i] < arr[j] > arr[k]. Examples: Input: arr[] = {2, 3, 1, -1}Output: 2Explanation: From the given array, all possible tri
8 min read
Minimum replacements required to have at most K distinct elements in the array
Given an array arr[] consisting of N positive integers and an integer K, the task is to find the minimum number of array elements required to be replaced by the other array elements such that the array contains at most K distinct elements. Input: arr[] = { 1, 1, 2, 2, 5 }, K = 2 Output: 1 Explanatio
13 min read
Count of subsets having sum of min and max element less than K
Given an integer array arr[] and an integer K, the task is to find the number of non-empty subsets S such that min(S) + max(S) < K.Examples: Input: arr[] = {2, 4, 5, 7} K = 8 Output: 4 Explanation: The possible subsets are {2}, {2, 4}, {2, 4, 5} and {2, 5}Input:: arr[] = {2, 4, 2, 5, 7} K = 10 Ou
5 min read
Count of subarrays of size K which is a permutation of numbers from 1 to K
Given an array arr of distinct integers, the task is to find the count of sub-arrays of size i having all elements from 1 to i, in other words, the sub-array is any permutation of elements from 1 to i, with 1 < = i <= N. Examples: Input: arr[] = {2, 3, 1, 5, 4} Output: 3 Explanation: we have {
6 min read
Finding Median of unsorted Array in linear time using C++ STL
Given an unsorted array arr[] having N elements, the task is to find out the median of the array in linear time complexity. Examples: Input: N = 5, arr[] = {4, 1, 2, 6, 5} Output: 4 Explanation: Since N = 5, which is odd, therefore the median is the 3rd element in the sorted array. The 3rd element i
3 min read
Print all array elements appearing more than N / K times
Given an array arr[] of size N and an integer K, the task is to find all the array elements that appear more than (N / K) times. Examples: Input: arr[] = { 1, 2, 6, 6, 6, 6, 6, 10 }, K = 4Output: 6Explanation: The frequency of 6 in the array is greater than N / K(= 2). Therefore, the required output
15+ min read
Frequency of an integer in the given array using Divide and Conquer
Given an unsorted array arr[] and an integer K, the task is to count the occurrences of K in the given array using the Divide and Conquer method. Examples: Input: arr[] = {1, 1, 2, 2, 2, 2, 3}, K = 1 Output: 2 Input: arr[] = {1, 1, 2, 2, 2, 2, 3}, K = 4 Output: 0 Approach: The idea is to divide the
5 min read