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++
#include <bits/stdc++.h>
using namespace std;
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;
}
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
import java.io.*;
import java.util.*;
public class Gfg {
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
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
if __name__ = = '__main__' :
arr = [ 6 , 8 , 9 ]
n = len (arr)
sum = 20
print (findMaxSubarraySum(arr, n, sum ))
|
C#
using System;
class Gfg {
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));
}
}
|
Javascript
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));
|
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++
#include <bits/stdc++.h>
using namespace std;
int findMaxSubarraySum( int arr[], int n, int sum)
{
int curr_sum = arr[0], max_sum = 0, start = 0;
for ( int i = 1; i < n; i++) {
if (curr_sum <= sum)
max_sum = max(max_sum, curr_sum);
while (start < i && curr_sum + arr[i] > sum) {
curr_sum -= arr[start];
start++;
}
if (curr_sum < 0)
{
curr_sum = 0;
}
curr_sum += arr[i];
}
if (curr_sum <= sum)
max_sum = max(max_sum, curr_sum);
return max_sum;
}
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
public class Main {
static int findMaxSubarraySum( int arr[],
int n, int sum)
{
int curr_sum = arr[ 0 ], max_sum = 0 , start = 0 ;
for ( int i = 1 ; i < n; i++) {
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
while (curr_sum + arr[i] > sum && start < i) {
curr_sum -= arr[start];
start++;
}
curr_sum += arr[i];
}
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
return max_sum;
}
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
def findMaxSubarraySum(arr, n, sum ):
curr_sum = arr[ 0 ]
max_sum = 0
start = 0 ;
for i in range ( 1 , n):
if (curr_sum < = sum ):
max_sum = max (max_sum, curr_sum)
while (curr_sum + arr[i] > sum and start < i):
curr_sum - = arr[start]
start + = 1
curr_sum + = arr[i]
if (curr_sum < = sum ):
max_sum = max (max_sum, curr_sum)
return max_sum
if __name__ = = '__main__' :
arr = [ 6 , 8 , 9 ]
n = len (arr)
sum = 20
print (findMaxSubarraySum(arr, n, sum ))
|
C#
using System;
public class GFG
{
static int findMaxSubarraySum( int []arr,
int n, int sum)
{
int curr_sum = arr[0], max_sum = 0, start = 0;
for ( int i = 1; i < n; i++) {
if (curr_sum <= sum)
max_sum = Math.Max(max_sum, curr_sum);
while (curr_sum + arr[i] > sum && start < i) {
curr_sum -= arr[start];
start++;
}
curr_sum += arr[i];
}
if (curr_sum <= sum)
max_sum = Math.Max(max_sum, curr_sum);
return max_sum;
}
public static void Main()
{
int []arr = {6, 8, 9};
int n = arr.Length;
int sum = 20;
Console.Write(findMaxSubarraySum(arr, n, sum));
}
}
|
PHP
<?php
function findMaxSubarraySum(& $arr , $n , $sum )
{
$curr_sum = $arr [0];
$max_sum = 0;
$start = 0;
for ( $i = 1; $i < $n ; $i ++)
{
if ( $curr_sum <= $sum )
$max_sum = max( $max_sum , $curr_sum );
while ( $curr_sum + $arr [ $i ] > $sum &&
$start < $i )
{
$curr_sum -= $arr [ $start ];
$start ++;
}
$curr_sum += $arr [ $i ];
}
if ( $curr_sum <= $sum )
$max_sum = max( $max_sum , $curr_sum );
return $max_sum ;
}
$arr = array (6, 8, 9);
$n = sizeof( $arr );
$sum = 20;
echo findMaxSubarraySum( $arr , $n , $sum );
?>
|
Javascript
<script>
function findMaxSubarraySum(arr, n, sum)
{
let curr_sum = arr[0], max_sum = 0,
start = 0;
for (let i = 1; i < n; i++)
{
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
while (curr_sum + arr[i] > sum && start < i)
{
curr_sum -= arr[start];
start++;
}
curr_sum += arr[i];
}
if (curr_sum <= sum)
max_sum = Math.max(max_sum, curr_sum);
return max_sum;
}
let arr = [ 6, 8, 9 ];
let n = arr.length;
let sum = 20;
document.write(findMaxSubarraySum(arr, n, sum));
</script>
|
Time Complexity: O(N*log(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.
This article is contributed by nuclode. 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.