Given an array arr[] containing n integers. The problem is to find the length of the subarray having maximum sum. If there exists two or more subarrays with maximum sum then print the length of the longest subarray.
Examples:
Input : arr[] = {5, -2, -1, 3, -4}
Output : 4
There are two subarrays with maximum sum:
First is {5}
Second is {5, -2, -1, 3}
Therefore longest one is of length 4.
Input : arr[] = {-2, -3, 4, -1, -2, 1, 5, -3}
Output : 5
The subarray is {4, -1, -2, 1, 5}
Approach: Following are the steps
- Find the maximum sum contiguous subarray. Let this sum be maxSum.
- Find the length of the longest subarray having sum equal to maxSum. Refer this post.
C++
#include <bits/stdc++.h>
using namespace std;
int maxSubArraySum( int arr[], int size)
{
int max_so_far = arr[0];
int curr_max = arr[0];
for ( int i = 1; i < size; i++) {
curr_max = max(arr[i], curr_max + arr[i]);
max_so_far = max(max_so_far, curr_max);
}
return max_so_far;
}
int lenOfLongSubarrWithGivenSum( int arr[], int n, int k)
{
unordered_map< int , int > um;
int sum = 0, maxLen = 0;
for ( int i = 0; i < n; i++) {
sum += arr[i];
if (sum == k)
maxLen = i + 1;
if (um.find(sum) == um.end())
um[sum] = i;
if (um.find(sum - k) != um.end()) {
if (maxLen < (i - um[sum - k]))
maxLen = i - um[sum - k];
}
}
return maxLen;
}
int lenLongSubarrWithMaxSum( int arr[], int n)
{
int maxSum = maxSubArraySum(arr, n);
return lenOfLongSubarrWithGivenSum(arr, n, maxSum);
}
int main()
{
int arr[] = { 5, -2, -1, 3, -4 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Length of longest subarray having maximum sum = "
<< lenLongSubarrWithMaxSum(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int maxSubArraySum( int arr[],
int size)
{
int max_so_far = arr[ 0 ];
int curr_max = arr[ 0 ];
for ( int i = 1 ; i < size; i++)
{
curr_max = Math.max(arr[i],
curr_max + arr[i]);
max_so_far = Math.max(max_so_far,
curr_max);
}
return max_so_far;
}
static int lenOfLongSubarrWithGivenSum( int arr[],
int n, int k)
{
HashMap<Integer,
Integer> um = new HashMap<Integer,
Integer>();
int sum = 0 , maxLen = 0 ;
for ( int i = 0 ; i < n; i++)
{
sum += arr[i];
if (sum == k)
maxLen = i + 1 ;
if (um.containsKey(sum))
um.put(sum, i);
if (um.containsKey(sum - k))
{
if (maxLen < (i - um.get(sum - k)))
maxLen = i - um.get(sum - k);
}
}
return maxLen;
}
static int lenLongSubarrWithMaxSum( int arr[], int n)
{
int maxSum = maxSubArraySum(arr, n);
return lenOfLongSubarrWithGivenSum(arr, n, maxSum);
}
public static void main(String args[])
{
int arr[] = { 5 , - 2 , - 1 , 3 , - 4 };
int n = arr.length;
System.out.println( "Length of longest subarray " +
"having maximum sum = " +
lenLongSubarrWithMaxSum(arr, n));
}
}
|
Python3
def maxSubArraySum(arr, size):
max_so_far = arr[ 0 ]
curr_max = arr[ 0 ]
for i in range ( 1 ,size):
curr_max = max (arr[i], curr_max + arr[i])
max_so_far = max (max_so_far, curr_max)
return max_so_far
def lenOfLongSubarrWithGivenSum(arr, n, k):
um = dict ()
Sum , maxLen = 0 , 0
for i in range (n):
Sum + = arr[i]
if ( Sum = = k):
maxLen = i + 1
if ( Sum not in um.keys()):
um[ Sum ] = i
if ( Sum in um.keys()):
if (( Sum - k) in um.keys() and
maxLen < (i - um[ Sum - k])):
maxLen = i - um[ Sum - k]
return maxLen
def lenLongSubarrWithMaxSum(arr, n):
maxSum = maxSubArraySum(arr, n)
return lenOfLongSubarrWithGivenSum(arr, n, maxSum)
arr = [ 5 , - 2 , - 1 , 3 , - 4 ]
n = len (arr)
print ( "Length of longest subarray having maximum sum = " ,
lenLongSubarrWithMaxSum(arr, n))
|
C#
using System;
using System.Collections.Generic;
public class GFG{
static int maxSubArraySum( int []arr,
int size)
{
int max_so_far = arr[0];
int curr_max = arr[0];
for ( int i = 1; i < size; i++)
{
curr_max = Math.Max(arr[i],
curr_max + arr[i]);
max_so_far = Math.Max(max_so_far,
curr_max);
}
return max_so_far;
}
static int lenOfLongSubarrWithGivenSum( int []arr,
int n, int k)
{
Dictionary< int ,
int > um = new Dictionary< int ,
int >();
int sum = 0, maxLen = 0;
for ( int i = 0; i < n; i++)
{
sum += arr[i];
if (sum == k)
maxLen = i + 1;
if (um.ContainsKey(sum))
um.Add(sum, i);
if (um.ContainsKey(sum - k))
{
if (maxLen < (i - um[sum - k]))
maxLen = i - um[sum - k];
}
}
return maxLen;
}
static int lenLongSubarrWithMaxSum( int []arr, int n)
{
int maxSum = maxSubArraySum(arr, n);
return lenOfLongSubarrWithGivenSum(arr, n, maxSum);
}
public static void Main()
{
int []arr = { 5, -2, -1, 3, -4 };
int n = arr.Length;
Console.WriteLine( "Length of longest subarray " +
"having maximum sum = " +
lenLongSubarrWithMaxSum(arr, n));
}
}
|
Javascript
<script>
function maxSubArraySum(arr, size)
{
var max_so_far = arr[0];
var curr_max = arr[0];
for ( var i = 1; i < size; i++) {
curr_max = Math.max(arr[i], curr_max + arr[i]);
max_so_far = Math.max(max_so_far, curr_max);
}
return max_so_far;
}
function lenOfLongSubarrWithGivenSum( arr, n, k)
{
var um = new Map();
var sum = 0, maxLen = 0;
for ( var i = 0; i < n; i++) {
sum += arr[i];
if (sum == k)
maxLen = i + 1;
if (!um.has(sum))
um.set(sum, i);
if (um.has(sum - k)) {
if (maxLen < (i - um.get(sum-k)))
maxLen = i - um.get(sum-k)
}
}
return maxLen;
}
function lenLongSubarrWithMaxSum(arr, n)
{
var maxSum = maxSubArraySum(arr, n);
return lenOfLongSubarrWithGivenSum(arr, n, maxSum);
}
var arr = [5, -2, -1, 3, -4];
var n = arr.length;
document.write( "Length of longest subarray having maximum sum = "
+ lenLongSubarrWithMaxSum(arr, n));
</script>
|
Output
Length of longest subarray having maximum sum = 4
Time Complexity: O(n).
Auxiliary Space: O(n).
Approach: Kadane’s algorithm
Following are the steps:
- traverse the array.
- Keep track of the maximum sum subarray ending at each index.
- Then, we return the length of the subarray with the maximum sum among all the subarrays.
Below is the implementation:
C++
#include <iostream>
#include <algorithm>
using namespace std;
int maxSubArrayLen( int arr[], int n) {
int max_so_far = arr[0];
int max_ending_here = arr[0];
int max_len = 1;
int curr_len = 1;
for ( int i = 1; i < n; i++) {
if (max_ending_here < 0) {
max_ending_here = arr[i];
curr_len = 1;
} else {
max_ending_here += arr[i];
curr_len++;
}
if (max_ending_here > max_so_far) {
max_so_far = max_ending_here;
max_len = curr_len;
} else if (max_ending_here == max_so_far) {
max_len = max(max_len, curr_len);
}
}
return max_len;
}
int main() {
int arr[] = {5, -2, -1, 3, -4};
int n = sizeof (arr) / sizeof (arr[0]);
int max_len = maxSubArrayLen(arr, n);
cout << "Length of the subarray with maximum sum = " << max_len << endl;
return 0;
}
|
Java
public class Main {
public static int maxSubArrayLen( int [] arr, int n) {
int max_so_far = arr[ 0 ];
int max_ending_here = arr[ 0 ];
int max_len = 1 ;
int curr_len = 1 ;
for ( int i = 1 ; i < n; i++) {
if (max_ending_here < 0 ) {
max_ending_here = arr[i];
curr_len = 1 ;
} else {
max_ending_here += arr[i];
curr_len++;
}
if (max_ending_here > max_so_far) {
max_so_far = max_ending_here;
max_len = curr_len;
} else if (max_ending_here == max_so_far) {
max_len = Math.max(max_len, curr_len);
}
}
return max_len;
}
public static void main(String[] args) {
int [] arr = { 5 , - 2 , - 1 , 3 , - 4 };
int n = arr.length;
int max_len = maxSubArrayLen(arr, n);
System.out.println( "Length of the subarray with maximum sum = " + max_len);
}
}
|
Python3
def maxSubArrayLen(arr):
max_so_far = arr[ 0 ]
max_ending_here = arr[ 0 ]
max_len = 1
curr_len = 1
for i in range ( 1 , len (arr)):
if max_ending_here < 0 :
max_ending_here = arr[i]
curr_len = 1
else :
max_ending_here + = arr[i]
curr_len + = 1
if max_ending_here > max_so_far:
max_so_far = max_ending_here
max_len = curr_len
elif max_ending_here = = max_so_far:
max_len = max (max_len, curr_len)
return max_len
if __name__ = = '__main__' :
arr = [ 5 , - 2 , - 1 , 3 , - 4 ]
max_len = maxSubArrayLen(arr)
print (f "Length of the subarray with maximum sum = {max_len}" )
|
C#
using System;
public class GFG
{
public static int MaxSubArrayLen( int [] arr, int n)
{
int maxSoFar = arr[0];
int maxEndingHere = arr[0];
int maxLen = 1;
int currLen = 1;
for ( int i = 1; i < n; i++)
{
if (maxEndingHere < 0)
{
maxEndingHere = arr[i];
currLen = 1;
}
else
{
maxEndingHere += arr[i];
currLen++;
}
if (maxEndingHere > maxSoFar)
{
maxSoFar = maxEndingHere;
maxLen = currLen;
}
else if (maxEndingHere == maxSoFar)
{
maxLen = Math.Max(maxLen, currLen);
}
}
return maxLen;
}
public static void Main( string [] args)
{
int [] arr = { 5, -2, -1, 3, -4 };
int n = arr.Length;
int maxLen = MaxSubArrayLen(arr, n);
Console.WriteLine( "Length of the subarray with maximum sum = " + maxLen);
}
}
|
Javascript
function maxSubArrayLen(arr) {
let max_so_far = arr[0];
let max_ending_here = arr[0];
let max_len = 1;
let curr_len = 1;
for (let i = 1; i < arr.length; i++) {
if (max_ending_here < 0) {
max_ending_here = arr[i];
curr_len = 1;
} else {
max_ending_here += arr[i];
curr_len++;
}
if (max_ending_here > max_so_far) {
max_so_far = max_ending_here;
max_len = curr_len;
} else if (max_ending_here === max_so_far) {
max_len = Math.max(max_len, curr_len);
}
}
return max_len;
}
const arr = [5, -2, -1, 3, -4];
const max_len = maxSubArrayLen(arr);
console.log( "Length of the subarray with maximum sum = " + max_len);
|
Output
Length of the subarray with maximum sum = 4
Time Complexity: O(n)
Auxiliary Space: O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!