Given an array arr[] of size N, and an integer K, the task is to find the count of array elements arr[i] which are greater than (arr[i – 1] + arr[i – 2] + … + arr[ i – K]).
Examples:
Input: arr[] = {2, 3, 8, 10, -2, 7, 5, 5, 9, 15}, K = 2
Output: 2
Explanation:
arr[2](> arr[1] + arr[0]) and arr[9](> arr[8] + arr[7]) are the two array elements exceeding sum of preceding K(= 2) elements.
Input: arr[] = {17, -2, 16, -8, 19, 11, 5, 15, -9, 24}, K = 3
Output: 2
Approach: Follow the steps below to solve the problem:
- Calculate and store the prefix sum of the given array.
- Traverse the array elements present in the indices [K, N – 1].
- For every array element, check if arr[i] exceeds (arr[i – 1] + arr[i – 2] + … + arr[i – K]) or not. Therefore, the task is to check if arr[i] exceeds prefix[i – 1] – prefix[i – (K + 1)] for K > i > N or if arr[i] exceeds prefix[i – 1] for i = K.
- Increment count for array element satisfying the above conditions. Finally, print the required count.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int countPrecedingK( int a[], int n, int K)
{
int prefix[n];
prefix[0] = a[0];
for ( int i = 1; i < n; i++) {
prefix[i]
= prefix[i - 1] + a[i];
}
int ctr = 0;
if (prefix[K - 1] < a[K])
ctr++;
for ( int i = K + 1; i < n; i++) {
if (prefix[i - 1] - prefix[i - K - 1]
< a[i])
ctr++;
}
return ctr;
}
int main()
{
int arr[] = { 2, 3, 8, 10, -2,
7, 5, 5, 9, 15 };
int N = sizeof (arr) / sizeof (arr[0]);
int K = 2;
cout << countPrecedingK(arr, N, K);
return 0;
}
|
Java
class GFG{
static int countPrecedingK( int a[], int n,
int K)
{
int []prefix = new int [n];
prefix[ 0 ] = a[ 0 ];
for ( int i = 1 ; i < n; i++)
{
prefix[i] = prefix[i - 1 ] + a[i];
}
int ctr = 0 ;
if (prefix[K - 1 ] < a[K])
ctr++;
for ( int i = K + 1 ; i < n; i++)
{
if (prefix[i - 1 ] -
prefix[i - K - 1 ] < a[i])
ctr++;
}
return ctr;
}
public static void main(String[] args)
{
int arr[] = { 2 , 3 , 8 , 10 , - 2 ,
7 , 5 , 5 , 9 , 15 };
int N = arr.length;
int K = 2 ;
System.out.print(countPrecedingK(arr, N, K));
}
}
|
Python3
def countPrecedingK(a, n, K):
prefix = [ 0 ] * n
prefix[ 0 ] = a[ 0 ]
for i in range ( 1 , n):
prefix[i] = prefix[i - 1 ] + a[i]
ctr = 0
if (prefix[K - 1 ] < a[K]):
ctr + = 1
for i in range (K + 1 , n):
if (prefix[i - 1 ] -
prefix[i - K - 1 ] < a[i]):
ctr + = 1
return ctr
if __name__ = = '__main__' :
arr = [ 2 , 3 , 8 , 10 , - 2 ,
7 , 5 , 5 , 9 , 15 ]
N = len (arr)
K = 2
print (countPrecedingK(arr, N, K))
|
C#
using System;
class GFG{
static int countPrecedingK( int []a,
int n, int K)
{
int []prefix = new int [n];
prefix[0] = a[0];
for ( int i = 1; i < n; i++)
{
prefix[i] = prefix[i - 1] + a[i];
}
int ctr = 0;
if (prefix[K - 1] < a[K])
ctr++;
for ( int i = K + 1; i < n; i++)
{
if (prefix[i - 1] -
prefix[i - K - 1] < a[i])
ctr++;
}
return ctr;
}
public static void Main(String[] args)
{
int []arr = {2, 3, 8, 10, -2,
7, 5, 5, 9, 15};
int N = arr.Length;
int K = 2;
Console.Write(countPrecedingK(arr, N, K));
}
}
|
Javascript
<script>
function countPrecedingK(a, n, K)
{
let prefix = new Array(n).fill(0);
prefix[0] = a[0];
for (let i = 1; i < n; i++)
{
prefix[i] = prefix[i - 1] + a[i];
}
let ctr = 0;
if (prefix[K - 1] < a[K])
ctr++;
for (let i = K + 1; i < n; i++)
{
if (prefix[i - 1] -
prefix[i - K - 1] < a[i])
ctr++;
}
return ctr;
}
let arr = [ 2, 3, 8, 10, -2,
7, 5, 5, 9, 15 ];
let N = arr.length;
let K = 2;
document.write(countPrecedingK(arr, N, K));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)