Given an array and a number k, the task is to calculate the sum of the product of all elements of subarrays of size k.
Examples :
Input : arr[] = {1, 2, 3, 4, 5, 6}
k = 3
Output : 210
Consider all subarrays of size k
1*2*3 = 6
2*3*4 = 24
3*4*5 = 60
4*5*6 = 120
6 + 24 + 60 + 120 = 210
Input : arr[] = {1, -2, 3, -4, 5, 6}
k = 2
Output : -10
Consider all subarrays of size k
1*-2 = -2
-2*3 = -6
3*-4 = -12
-4*5 = -20
5*6 = 30
-2 + -6 + -12 + -20+ 30 = -10
A Naive approach is to generate all subarrays of size k and do the sum of product of all elements of subarrays.
Implementation:
C++
#include <iostream>
using namespace std;
int calcSOP( int arr[], int n, int k)
{
int sum = 0;
for ( int i = 0; i <= n - k; i++) {
int prod = 1;
for ( int j = i; j < k + i; j++)
prod *= arr[j];
sum += prod;
}
return sum;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 3;
cout << calcSOP(arr, n, k);
return 0;
}
|
Java
class GFG {
static int calcSOP( int arr[], int n, int k)
{
int sum = 0 ;
for ( int i = 0 ; i <= n - k; i++) {
int prod = 1 ;
for ( int j = i; j < k + i; j++)
prod *= arr[j];
sum += prod;
}
return sum;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 6 };
int k = 3 ;
System.out.println(calcSOP(arr, arr.length, k));
}
}
|
Python3
def calcSOP(arr, n, k):
sum = 0
for i in range ( 0 , (n - k) + 1 ):
prod = 1
for j in range (i, k + i):
prod = int (prod * arr[j])
sum = sum + prod
return sum
arr = [ 1 , 2 , 3 , 4 , 5 , 6 ]
n = len (arr)
k = 3
print (calcSOP(arr, n, k))
|
C#
using System;
public class GFG {
static int calcSOP( int [] arr, int n, int k)
{
int sum = 0;
for ( int i = 0; i <= n - k; i++) {
int prod = 1;
for ( int j = i; j < k + i; j++)
prod *= arr[j];
sum += prod;
}
return sum;
}
public static void Main()
{
int [] arr = {1, 2, 3, 4, 5, 6};
int k = 3;
Console.WriteLine(calcSOP(arr, arr.Length, k));
}
}
|
PHP
<?php
function calcSOP( $arr , $n , $k )
{
$sum = 0;
for ( $i = 0; $i <= $n - $k ; $i ++)
{
$prod = 1;
for ( $j = $i ; $j < $k + $i ; $j ++)
$prod *= $arr [ $j ];
$sum += $prod ;
}
return $sum ;
}
$arr = array ( 1, 2, 3, 4, 5, 6 );
$n = count ( $arr );
$k = 3;
echo calcSOP( $arr , $n , $k );
?>
|
Javascript
<script>
function calcSOP(arr, n, k) {
let sum = 0;
for (let i = 0; i <= n - k; i++) {
let prod = 1;
for (let j = i; j < k + i; j++)
prod *= arr[j];
sum += prod;
}
return sum;
}
let arr = new Array(1, 2, 3, 4, 5, 6);
let n = arr.length;
let k = 3;
document.write(calcSOP(arr, n, k));
</script>
|
Time Complexity: O(nk)
An Efficient Method is to use the concept of Sliding Window.
1- Consider first subarray/window of size k, do the product of elements and add to the total_sum.
for (i=0; i < k; i++)
prod = prod * arr[i];
2- Now, By Using sliding window concept, remove first element of window from the product and add next element to the window. i.e.
for (i =k ; i < n; i++)
{
// Removing first element from product
prod = prod / arr[i-k];
// Adding current element to the product
prod = prod * arr[i];
sum += prod;
}
3- Return sum
C++
#include <iostream>
using namespace std;
int calcSOP( int arr[], int n, int k)
{
int sum = 0, prod = 1;
for ( int i = 0; i < k; i++)
prod *= arr[i];
sum += prod;
for ( int i = k; i < n; i++) {
prod = (prod / arr[i - k]) * arr[i];
sum += prod;
}
return sum;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 3;
cout << calcSOP(arr, n, k);
return 0;
}
|
Java
class GFG {
static int calcSOP( int arr[], int n, int k)
{
int sum = 0 , prod = 1 ;
for ( int i = 0 ; i < k; i++)
prod *= arr[i];
sum += prod;
for ( int i = k; i < n; i++) {
prod = (prod / arr[i - k]) * arr[i];
sum += prod;
}
return sum;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 6 };
int k = 3 ;
System.out.println(calcSOP(arr, arr.length, k));
}
}
|
Python3
def calcSOP(arr, n, k):
sum = 0
prod = 1
for i in range (k):
prod * = arr[i]
sum + = prod
for i in range (k, n, 1 ):
prod = (prod / arr[i - k]) * arr[i]
sum + = prod
return int ( sum )
arr = [ 1 , 2 , 3 , 4 , 5 , 6 ]
n = len (arr)
k = 3
print (calcSOP(arr, n, k))
|
C#
using System;
public class GFG {
static int calcSOP( int [] arr, int n, int k)
{
int sum = 0, prod = 1;
for ( int i = 0; i < k; i++)
prod *= arr[i];
sum += prod;
for ( int i = k; i < n; i++) {
prod = (prod / arr[i - k]) * arr[i];
sum += prod;
}
return sum;
}
public static void Main()
{
int [] arr = { 1, 2, 3, 4, 5, 6 };
int k = 3;
Console.WriteLine(calcSOP(arr, arr.Length, k));
}
}
|
PHP
<?php
function calcSOP( $arr , $n , $k )
{
$sum = 0;
$prod = 1;
for ( $i = 0; $i < $k ; $i ++)
$prod *= $arr [ $i ];
$sum += $prod ;
for ( $i = $k ; $i < $n ; $i ++) {
$prod = ( $prod / $arr [ $i - $k ]) * $arr [ $i ];
$sum += $prod ;
}
return $sum ;
}
$arr = array ( 1, 2, 3, 4, 5, 6 );
$n = count ( $arr );
$k = 3;
echo calcSOP( $arr , $n , $k );
?>
|
Javascript
<script>
function calcSOP(arr,n,k)
{
let sum = 0, prod = 1;
for (let i = 0; i < k; i++)
prod *= arr[i];
sum += prod;
for (let i = k; i < n; i++) {
prod = (Math.floor(prod / arr[i - k])) * arr[i];
sum += prod;
}
return sum;
}
let arr= [1, 2, 3, 4, 5, 6 ];
let k = 3;
document.write(calcSOP(arr, arr.length, k));
</script>
|
Time Complexity: O(n)
This article is contributed by Sahil Chhabra. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.