Given an array of non-negative integers and a sum. We have to find sum of the subarray having a maximum sum less than or equal to the given sum in the array.
Note: Given array contains only non-negative integers.
Examples:
Input: arr[] = { 1, 2, 3, 4, 5 }
sum = 11
Output: 10
Subarray having maximum sum is { 1, 2, 3, 4 }
Input: arr[] = { 2, 4, 6, 8, 10 }
sum = 7
Output: 6
Subarray having maximum sum is { 2, 4 } or { 6 }
Naive Approach: We can find the maximum sum of the subarray by running two loops.
// C++ program to find subarray having // maximum sum less than or equal to sum #include <bits/stdc++.h> using namespace std;
// To find subarray with maximum sum // less than or equal to sum int findMaxSubarraySum( int arr[], int n, int sum)
{ int result = 0;
for ( int i = 0; i < n; i++) {
int currSum = 0;
for ( int j = i; j < n; j++) {
currSum += arr[j];
if (currSum < sum) {
result = max(result, currSum);
}
}
}
return result;
} // Driver program to test above function int main()
{ int arr[] = { 6, 8, 9 };
int n = sizeof (arr) / sizeof (arr[0]);
int sum = 20;
cout << findMaxSubarraySum(arr, n, sum);
return 0;
} |
import java.io.*;
import java.util.*;
public class Gfg {
// To find subarray with maximum sum
// less than or equal to sum
static int findMaxSubarraySum( int [] arr, int n, int sum)
{
int result = 0 ;
for ( int i = 0 ; i < n; i++) {
int currSum = 0 ;
for ( int j = i; j < n; j++) {
currSum += arr[j];
if (currSum < sum) {
result = Math.max(result, currSum);
}
}
}
return result;
}
public static void main(String[] args)
{
int [] arr = { 6 , 8 , 9 };
int n = arr.length;
int sum = 20 ;
System.out.println(findMaxSubarraySum(arr, n, sum));
}
} |
# Python3 program to find subarray having # maximum sum less than or equal to sum # To find subarray with maximum sum # less than or equal to sum def findMaxSubarraySum(arr, n, sum ):
result = 0
for i in range (n):
currSum = 0
for j in range (i, n):
currSum + = arr[j]
if currSum < sum :
result = max (result, currSum)
return result
# Driver program to test above function if __name__ = = '__main__' :
arr = [ 6 , 8 , 9 ]
n = len (arr)
sum = 20
print (findMaxSubarraySum(arr, n, sum ))
# This code is contributed by Prajwal Kandekar |
using System;
class Gfg {
// To find subarray with maximum sum
// less than or equal to sum
static int findMaxSubarraySum( int [] arr, int n, int sum)
{
int result = 0;
for ( int i = 0; i < n; i++) {
int currSum = 0;
for ( int j = i; j < n; j++) {
currSum += arr[j];
if (currSum < sum) {
result = Math.Max(result, currSum);
}
}
}
return result;
}
public static void Main()
{
int [] arr = { 6, 8, 9 };
int n = arr.Length;
int sum = 20;
Console.WriteLine(findMaxSubarraySum(arr, n, sum));
}
} |
// To find subarray with maximum sum // less than or equal to sum function findMaxSubarraySum(arr, n, sum) {
let result = 0;
for (let i = 0; i < n; i++) {
let currSum = 0;
for (let j = i; j < n; j++) {
currSum += arr[j];
if (currSum < sum) {
result = Math.max(result, currSum);
}
}
}
return result;
} const arr = [6, 8, 9]; const n = arr.length; const sum = 20; console.log(findMaxSubarraySum(arr, n, sum)); |
17
Time Complexity: O(N*N)
Auxiliary Space: O(1)
Efficient Approach: The subarray having maximum sum can be found by using a sliding window. If curr_sum is less than sum include array elements to it. If it becomes greater than sum removes elements from start in curr_sum. (This will work only in the case of non-negative elements.)
Implementation:
// C++ program to find subarray having // maximum sum less than or equal to sum #include <bits/stdc++.h> using namespace std;
// To find subarray with maximum sum // less than or equal to sum int findMaxSubarraySum( int arr[], int n, int sum)
{ // To store current sum and
// max sum of subarrays
int curr_sum = arr[0], max_sum = 0, start = 0;
// To find max_sum less than sum
for ( int i = 1; i < n; i++) {
// Update max_sum if it becomes
// greater than curr_sum
if (curr_sum <= sum)
max_sum = max(max_sum, curr_sum);
// If curr_sum becomes greater than
// sum subtract starting elements of array
while (start < i && curr_sum + arr[i] > sum) {
curr_sum -= arr[start];
start++;
}
// If cur_sum becomes negative then start new subarray
if (curr_sum < 0)
{
curr_sum = 0;
}
// Add elements to curr_sum
curr_sum += arr[i];
}
// Adding an extra check for last subarray
if (curr_sum <= sum)
max_sum = max(max_sum, curr_sum);
return max_sum;
} // Driver program to test above function int main()
{ int arr[] = {6, 8, 9};
int n = sizeof (arr) / sizeof (arr[0]);
int sum = 20;
cout << findMaxSubarraySum(arr, n, sum);
return 0;
} |
// Java program to find subarray having // maximum sum less than or equal to sum public class Main {
// To find subarray with maximum sum
// less than or equal to sum
static int findMaxSubarraySum( int arr[],
int n, int sum)
{
// To store current sum and
// max sum of subarrays
int curr_sum = arr[ 0 ], max_sum = 0 , start = 0 ;
// To find max_sum less than sum
for ( int i = 1 ; i < n; i++) {
// Update max_sum if it becomes
// greater than curr_sum
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
// If curr_sum becomes greater than
// sum subtract starting elements of array
while (curr_sum + arr[i] > sum && start < i) {
curr_sum -= arr[start];
start++;
}
// Add elements to curr_sum
curr_sum += arr[i];
}
// Adding an extra check for last subarray
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
return max_sum;
}
// Driver program to test above function
public static void main(String[] args)
{
int arr[] = { 6 , 8 , 9 };
int n = arr.length;
int sum = 20 ;
System.out.println(findMaxSubarraySum(arr, n, sum));
}
} |
# Python3 program to find subarray having # maximum sum less than or equal to sum # To find subarray with maximum sum # less than or equal to sum def findMaxSubarraySum(arr, n, sum ):
# To store current sum and
# max sum of subarrays
curr_sum = arr[ 0 ]
max_sum = 0
start = 0 ;
# To find max_sum less than sum
for i in range ( 1 , n):
# Update max_sum if it becomes
# greater than curr_sum
if (curr_sum < = sum ):
max_sum = max (max_sum, curr_sum)
# If curr_sum becomes greater than sum
# subtract starting elements of array
while (curr_sum + arr[i] > sum and start < i):
curr_sum - = arr[start]
start + = 1
# Add elements to curr_sum
curr_sum + = arr[i]
# Adding an extra check for last subarray
if (curr_sum < = sum ):
max_sum = max (max_sum, curr_sum)
return max_sum
# Driver Code if __name__ = = '__main__' :
arr = [ 6 , 8 , 9 ]
n = len (arr)
sum = 20
print (findMaxSubarraySum(arr, n, sum ))
# This code is contributed by # Surendra_Gangwar |
// C# program to find subarray // having maximum sum less //than or equal to sum using System;
public class GFG
{ // To find subarray with maximum
// sum less than or equal
// to sum
static int findMaxSubarraySum( int []arr,
int n, int sum)
{ // To store current sum and
// max sum of subarrays
int curr_sum = arr[0], max_sum = 0, start = 0;
// To find max_sum less than sum
for ( int i = 1; i < n; i++) {
// Update max_sum if it becomes
// greater than curr_sum
if (curr_sum <= sum)
max_sum = Math.Max(max_sum, curr_sum);
// If curr_sum becomes greater than
// sum subtract starting elements of array
while (curr_sum + arr[i] > sum && start < i) {
curr_sum -= arr[start];
start++;
}
// Add elements to curr_sum
curr_sum += arr[i];
}
// Adding an extra check for last subarray
if (curr_sum <= sum)
max_sum = Math.Max(max_sum, curr_sum);
return max_sum;
}
// Driver Code
public static void Main()
{
int []arr = {6, 8, 9};
int n = arr.Length;
int sum = 20;
Console.Write(findMaxSubarraySum(arr, n, sum));
}
} // This code is contributed by Nitin Mittal. |
<script> // Javascript program to find subarray having // maximum sum less than or equal to sum // To find subarray with maximum sum // less than or equal to sum function findMaxSubarraySum(arr, n, sum)
{ // To store current sum and
// max sum of subarrays
let curr_sum = arr[0], max_sum = 0,
start = 0;
// To find max_sum less than sum
for (let i = 1; i < n; i++)
{
// Update max_sum if it becomes
// greater than curr_sum
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
// If curr_sum becomes greater than
// sum subtract starting elements of array
while (curr_sum + arr[i] > sum && start < i)
{
curr_sum -= arr[start];
start++;
}
// Add elements to curr_sum
curr_sum += arr[i];
}
// Adding an extra check for last subarray
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
return max_sum;
} // Driver code let arr = [ 6, 8, 9 ]; let n = arr.length; let sum = 20; document.write(findMaxSubarraySum(arr, n, sum)); // This code is contributed by Mayank Tyagi </script> |
<?php // PHP program to find subarray having // maximum sum less than or equal to sum // To find subarray with maximum sum // less than or equal to sum function findMaxSubarraySum(& $arr , $n , $sum )
{ // To store current sum and
// max sum of subarrays
$curr_sum = $arr [0];
$max_sum = 0;
$start = 0;
// To find max_sum less than sum
for ( $i = 1; $i < $n ; $i ++)
{
// Update max_sum if it becomes
// greater than curr_sum
if ( $curr_sum <= $sum )
$max_sum = max( $max_sum , $curr_sum );
// If curr_sum becomes greater than
// sum subtract starting elements of array
while ( $curr_sum + $arr [ $i ] > $sum &&
$start < $i )
{
$curr_sum -= $arr [ $start ];
$start ++;
}
// Add elements to curr_sum
$curr_sum += $arr [ $i ];
}
// Adding an extra check for last subarray
if ( $curr_sum <= $sum )
$max_sum = max( $max_sum , $curr_sum );
return $max_sum ;
} // Driver Code $arr = array (6, 8, 9);
$n = sizeof( $arr );
$sum = 20;
echo findMaxSubarraySum( $arr , $n , $sum );
// This code is contributed by ita_c ?> |
17
Time Complexity: O(n)
Auxiliary Space: O(1)
If an array with all types(positive, negative or zero) of elements is given, we can use prefix sum and sets and worst case time complexity for that will be O(n.log(n)). You can refer Maximum Subarray sum less than or equal to k using set article for more clarity of this method.