Given an array arr[] and two integers K and X, the task is to find the maximum sum among all subarrays of size K with the sum less than X.
Examples:
Input: arr[] = {20, 2, 3, 10, 5}, K = 3, X = 20
Output: 18
Explanation: Subarray of size 3 having maximum sum less than 20 is {3, 10, 5}. Therefore, required output is 18.Input: arr[] = {-5, 8, 7, 2, 10, 1, 20, -4, 6, 9}, K = 5, X = 30
Output: 29
Explanation: Subarray of size 5having maximum sum less than 30 is {2, 10, 1, 20, -4}. Therefore, required output is 29.
Naive Approach: The simplest approach to solve the problem is to generate all subarrays of size K and check if its sum is less than X or not. Print the maximum sum obtained among all such subarrays.
Time Complexity: O(N * K)
Auxiliary Space: O(1)
Efficient Approach: Follow the steps below to solve the problem using Sliding Window technique:
- Initialize a variable sum_K to store the sum of first K array elements.
- If sum_K is less than X, then initialize Max_Sum with sum_K.
-
Traverse the array from (K + 1)th index and perform the following:
- In each iteration, subtract the first element of the previous K length subarray and add the current element to sum_K.
- If sum_K is less than X, then compare sum_K with Max_Sum and update Max_Sum accordingly.
- Finally, print Max_Sum.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to calculate maximum sum // among all subarrays of size K // with the sum less than X void maxSumSubarr( int A[], int N,
int K, int X)
{ // Initialize sum_K to 0
int sum_K = 0;
// Calculate sum of first K elements
for ( int i = 0; i < K; i++) {
sum_K += A[i];
}
int Max_Sum = 0;
// If sum_K is less than X
if (sum_K < X) {
// Initialize MaxSum with sum_K
Max_Sum = sum_K;
}
// Iterate over the array from
// (K + 1)-th index
for ( int i = K; i < N; i++) {
// Subtract the first element
// from the previous K elements
// and add the next element
sum_K -= (A[i - K] - A[i]);
// If sum_K is less than X
if (sum_K < X) {
// Update the Max_Sum
Max_Sum = max(Max_Sum, sum_K);
}
}
cout << Max_Sum << endl;
} // Driver Code int main()
{ int arr[] = { -5, 8, 7, 2, 10,
1, 20, -4, 6, 9 };
int K = 5;
int X = 30;
// Size of Array
int N = sizeof (arr)
/ sizeof (arr[0]);
// Function Call
maxSumSubarr(arr, N, K, X);
return 0;
} |
// Java program for the above approach import java.io.*;
class GFG{
// Function to calculate maximum sum // among all subarrays of size K // with the sum less than X private static void maxSumSubarr( int A[], int N,
int K, int X)
{ // Initialize sum_K to 0
int sum_K = 0 ;
// Calculate sum of first K elements
for ( int i = 0 ; i < K; i++)
{
sum_K += A[i];
}
int Max_Sum = 0 ;
// If sum_K is less than X
if (sum_K < X)
{
// Initialize MaxSum with sum_K
Max_Sum = sum_K;
}
// Iterate over the array from
// (K + 1)-th index
for ( int i = K; i < N; i++)
{
// Subtract the first element
// from the previous K elements
// and add the next element
sum_K -= (A[i - K] - A[i]);
// If sum_K is less than X
if (sum_K < X)
{
// Update the Max_Sum
Max_Sum = Math.max(Max_Sum, sum_K);
}
}
System.out.println(Max_Sum);
} // Driver Code public static void main (String[] args)
{ int arr[] = { - 5 , 8 , 7 , 2 , 10 ,
1 , 20 , - 4 , 6 , 9 };
int K = 5 ;
int X = 30 ;
// Size of Array
int N = arr.length;
// Function Call
maxSumSubarr(arr, N, K, X);
} } // This code is contributed by jithin |
# Python3 program for the above approach # Function to calculate maximum sum # among all subarrays of size K # with the sum less than X def maxSumSubarr(A, N, K, X):
# Initialize sum_K to 0
sum_K = 0
# Calculate sum of first K elements
for i in range ( 0 , K):
sum_K + = A[i]
Max_Sum = 0
# If sum_K is less than X
if (sum_K < X):
# Initialize MaxSum with sum_K
Max_Sum = sum_K
# Iterate over the array from
# (K + 1)-th index
for i in range (K, N):
# Subtract the first element
# from the previous K elements
# and add the next element
sum_K - = (A[i - K] - A[i])
# If sum_K is less than X
if (sum_K < X):
# Update the Max_Sum
Max_Sum = max (Max_Sum, sum_K)
print (Max_Sum)
# Driver Code arr = [ - 5 , 8 , 7 , 2 , 10 ,
1 , 20 , - 4 , 6 , 9 ]
K = 5
X = 30
# Size of Array N = len (arr)
# Function Call maxSumSubarr(arr, N, K, X) # This code is contributed by sanjoy_62 |
// C# program for the above approach using System;
class GFG{
// Function to calculate maximum sum // among all subarrays of size K // with the sum less than X private static void maxSumSubarr( int []A, int N,
int K, int X)
{ // Initialize sum_K to 0
int sum_K = 0;
// Calculate sum of first K elements
for ( int i = 0; i < K; i++)
{
sum_K += A[i];
}
int Max_Sum = 0;
// If sum_K is less than X
if (sum_K < X)
{
// Initialize MaxSum with sum_K
Max_Sum = sum_K;
}
// Iterate over the array from
// (K + 1)-th index
for ( int i = K; i < N; i++)
{
// Subtract the first element
// from the previous K elements
// and add the next element
sum_K -= (A[i - K] - A[i]);
// If sum_K is less than X
if (sum_K < X)
{
// Update the Max_Sum
Max_Sum = Math.Max(Max_Sum, sum_K);
}
}
Console.WriteLine(Max_Sum);
} // Driver Code public static void Main(String[] args)
{ int []arr = { -5, 8, 7, 2, 10,
1, 20, -4, 6, 9 };
int K = 5;
int X = 30;
// Size of Array
int N = arr.Length;
// Function Call
maxSumSubarr(arr, N, K, X);
} } // This code is contributed by Amit Katiyar |
<script> // JavaScript program to implement the above approach // Function to calculate maximum sum // among all subarrays of size K // with the sum less than X function maxSumSubarr(A, N, K, X)
{ // Initialize sum_K to 0
let sum_K = 0;
// Calculate sum of first K elements
for (let i = 0; i < K; i++) {
sum_K += A[i];
}
let Max_Sum = 0;
// If sum_K is less than X
if (sum_K < X) {
// Initialize MaxSum with sum_K
Max_Sum = sum_K;
}
// Iterate over the array from
// (K + 1)-th index
for (let i = K; i < N; i++) {
// Subtract the first element
// from the previous K elements
// and add the next element
sum_K -= (A[i - K] - A[i]);
// If sum_K is less than X
if (sum_K < X) {
// Update the Max_Sum
Max_Sum = Math.max(Max_Sum, sum_K);
}
}
document.write(Max_Sum);
} // Driver Code let arr = [ -5, 8, 7, 2, 10,
1, 20, -4, 6, 9 ];
let K = 5;
let X = 30;
// Size of Array
let N = arr.length;
// Function Call
maxSumSubarr(arr, N, K, X);
// This code is contributed by susmitakundugoaldanga.
</script> |
29
Time Complexity: O(N)
Auxiliary Space: O(1)