Maximum sum subarray having sum less than or equal to given sum

Given an array of integers and a sum. We have to find sum of subarray having maximum sum less than or equal to given sum in array.

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 maximum sum of subarray by running two loops. But the time complecxity will be O(N*N).

Efficient Approach: The subarray having maximum sum can be found by using sliding window. If curr_sum is less than sum include array elements to it. If it becomes greater than sum remove elements from start in curr_sum.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP 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 (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 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; 

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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[] = { 1, 2, 3, 4, 5 };
        int n = arr.length;
        int sum = 11;
  
        System.out.println(findMaxSubarraySum(arr, n, sum));
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 = {1, 2, 3, 4, 5};
        int n = arr.Length;
        int sum = 11;
  
        Console.Write(findMaxSubarraySum(arr, n, sum));
    }
}
  
// This code is contributed by Nitin Mittal.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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
?>

chevron_right


Output:

17

This article is contributed by nuclode. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up



Article Tags :
Practice Tags :


2


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.