Subarray of size k with given sum
Given an array arr[], an integer K and a Sum. The task is to check if there exists any subarray with K elements whose sum is equal to the given sum. If any of the subarray with size K has the sum equal to the given sum then print YES otherwise print NO.
Examples:
Input: arr[] = {1, 4, 2, 10, 2, 3, 1, 0, 20}
k = 4, sum = 18
Output: YES
Subarray = {4, 2, 10, 2}
Input: arr[] = {1, 4, 2, 10, 2, 3, 1, 0, 20}
k = 3, sum = 6
Output: YES
A simple solution is to use nested loops, where we check every subarray of size k.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
bool checkSubarraySum( int arr[], int n,
int k, int sum)
{
for ( int i = 0; i < n - k + 1; i++) {
int current_sum = 0;
for ( int j = 0; j < k; j++)
current_sum = current_sum + arr[i + j];
if (current_sum == sum)
return true ;
}
return false ;
}
int main()
{
int arr[] = { 1, 4, 2, 10, 2, 3, 1, 0, 20 };
int k = 4;
int sum = 18;
int n = sizeof (arr) / sizeof (arr[0]);
if (checkSubarraySum(arr, n, k, sum))
cout << "YES" ;
else
cout << "NO" ;
return 0;
}
|
Java
class GFG
{
static boolean checkSubarraySum( int arr[], int n,
int k, int sum)
{
for ( int i = 0 ; i < n - k + 1 ; i++)
{
int current_sum = 0 ;
for ( int j = 0 ; j < k; j++)
current_sum = current_sum +
arr[i + j];
if (current_sum == sum)
return true ;
}
return false ;
}
public static void main(String args[])
{
int arr[] = new int [] { 1 , 4 , 2 , 10 , 2 ,
3 , 1 , 0 , 20 };
int k = 4 ;
int sum = 18 ;
int n = arr.length;
if (checkSubarraySum(arr, n, k, sum))
System.out.println( "YES" );
else
System.out.println( "NO" );
}
}
|
Python3
def checkSubarraySum(arr, n, k, sum ):
for i in range (n - k + 1 ):
current_sum = 0 ;
for j in range (k):
current_sum = (current_sum +
arr[i + j]);
if (current_sum = = sum ):
return True ;
return False ;
arr = [ 1 , 4 , 2 , 10 , 2 ,
3 , 1 , 0 , 20 ];
k = 4 ;
sum = 18 ;
n = len (arr);
if (checkSubarraySum(arr, n, k, sum )):
print ( "YES" );
else :
print ( "NO" );
|
C#
using System;
class GFG
{
static bool checkSubarraySum( int [] arr, int n,
int k, int sum)
{
for ( int i = 0; i < n - k + 1; i++)
{
int current_sum = 0;
for ( int j = 0; j < k; j++)
current_sum = current_sum +
arr[i + j];
if (current_sum == sum)
return true ;
}
return false ;
}
static void Main()
{
int [] arr = new int [] { 1, 4, 2, 10,
2, 3, 1, 0, 20 };
int k = 4;
int sum = 18;
int n = arr.Length;
if (checkSubarraySum(arr, n, k, sum))
Console.WriteLine( "YES" );
else
Console.WriteLine( "NO" );
}
}
|
PHP
<?php
function checkSubarraySum( $arr , $n ,
$k , $sum )
{
for ( $i = 0; $i < $n - $k + 1; $i ++)
{
$current_sum = 0;
for ( $j = 0; $j < $k ; $j ++)
$current_sum = $current_sum +
$arr [ $i + $j ];
if ( $current_sum == $sum )
return true;
}
return false;
}
$arr = array (1, 4, 2, 10, 2,
3, 1, 0, 20);
$k = 4;
$sum = 18;
$n = sizeof( $arr );
if (checkSubarraySum( $arr , $n ,
$k , $sum ))
echo "YES" ;
else
echo "NO" ;
?>
|
Javascript
<script>
function checkSubarraySum(arr, n, k, sum)
{
for (let i = 0; i < n - k + 1; i++)
{
let current_sum = 0;
for (let j = 0; j < k; j++)
current_sum = current_sum + arr[i + j];
if (current_sum == sum)
return true ;
}
return false ;
}
let arr = [ 1, 4, 2, 10, 2, 3, 1, 0, 20 ];
let k = 4;
let sum = 18;
let n = arr.length;
if (checkSubarraySum(arr, n, k, sum))
document.write( "YES" );
else
document.write( "NO" );
</script>
|
Time Complexity: O(n * k)
An efficient solution is to check sliding window technique and simultaneously check if the sum is equal to the given sum.
Implementation:
C++
#include <iostream>
using namespace std;
bool checkSubarraySum( int arr[], int n,
int k, int sum)
{
int curr_sum = 0;
for ( int i=0; i<k; i++)
curr_sum += arr[i];
if (curr_sum == sum)
return true ;
for ( int j = k; j < n; j++) {
curr_sum = curr_sum + arr[j] - arr[j-k];
if (curr_sum == sum)
return true ;
}
return false ;
}
int main()
{
int arr[] = { 1, 4, 2, 10, 2, 3, 1, 0, 20 };
int k = 4;
int sum = 18;
int n = sizeof (arr) / sizeof (arr[0]);
if (checkSubarraySum(arr, n, k, sum))
cout << "YES" ;
else
cout << "NO" ;
return 0;
}
|
Java
class GFG{
static boolean checkSubarraySum( int [] arr, int n,
int k, int sum)
{
int curr_sum = 0 ;
for ( int i= 0 ; i<k; i++)
curr_sum += arr[i];
if (curr_sum == sum)
return true ;
for ( int j = k; j < n; j++) {
curr_sum = curr_sum + arr[j] - arr[j-k];
if (curr_sum == sum)
return true ;
}
return false ;
}
public static void main(String[] args)
{
int [] arr= new int []{ 1 , 4 , 2 , 10 , 2 , 3 , 1 , 0 , 20 };
int k = 4 ;
int sum = 18 ;
int n = arr.length;
if (checkSubarraySum(arr, n, k, sum))
System.out.println( "YES" );
else
System.out.println( "NO" );
}
}
|
Python3
def checkSubarraySum(arr, n,
k, sumV):
curr_sum = 0
for i in range ( 0 , k):
curr_sum + = arr[i]
if (curr_sum = = sumV):
return true
for j in range (k, n):
curr_sum = (curr_sum + arr[j] -
arr[j - k])
if (curr_sum = = sumV) :
return True
return False
arr = [ 1 , 4 , 2 , 10 , 2 ,
3 , 1 , 0 , 20 ]
k = 4
sumV = 18
n = len (arr)
if (checkSubarraySum(arr, n, k, sumV)):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
class GFG{
static bool checkSubarraySum( int [] arr, int n,
int k, int sum)
{
int curr_sum = 0;
for ( int i=0; i<k; i++)
curr_sum += arr[i];
if (curr_sum == sum)
return true ;
for ( int j = k; j < n; j++) {
curr_sum = curr_sum + arr[j] - arr[j-k];
if (curr_sum == sum)
return true ;
}
return false ;
}
static void Main()
{
int [] arr= new int []{ 1, 4, 2, 10, 2, 3, 1, 0, 20 };
int k = 4;
int sum = 18;
int n = arr.Length;
if (checkSubarraySum(arr, n, k, sum))
Console.WriteLine( "YES" );
else
Console.WriteLine( "NO" );
}
}
|
PHP
<?php
function checkSubarraySum( $arr , $n ,
$k , $sum )
{
$curr_sum = 0;
for ( $i = 0; $i < $k ; $i ++)
$curr_sum += $arr [ $i ];
if ( $curr_sum == $sum )
return true;
for ( $j = $k ; $j < $n ; $j ++)
{
$curr_sum = $curr_sum + $arr [ $j ] -
$arr [ $j - $k ];
if ( $curr_sum == $sum )
return true;
}
return false;
}
$arr = array ( 1, 4, 2, 10,
2, 3, 1, 0, 20 );
$k = 4;
$sum = 18;
$n = count ( $arr );
if (checkSubarraySum( $arr , $n , $k , $sum ))
echo "YES" ;
else
echo "NO" ;
?>
|
Javascript
<script>
function checkSubarraySum(arr, n,
k, sum)
{
let curr_sum = 0;
for (let i = 0; i < k; i++)
curr_sum += arr[i];
if (curr_sum == sum)
return true ;
for (let j = k; j < n; j++)
{
curr_sum = curr_sum + arr[j] -
arr[j - k];
if (curr_sum == sum)
return true ;
}
return false ;
}
let arr = new Array( 1, 4, 2, 10,
2, 3, 1, 0, 20 );
let k = 4;
let sum = 18;
let n = arr.length;
if (checkSubarraySum(arr, n, k, sum))
document.write( "YES" );
else
document.write( "NO" );
</script>
|
Time Complexity: O(n)
Related Topic: Subarrays, Subsequences, and Subsets in Array
Last Updated :
01 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...