Longest subarray having maximum sum

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}
```

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Following are the steps:

1. Find the maximum sum contiguous subarray. Let this sum be maxSum.
2. Find the length of the longest subarray having sum equal to maxSum. Refer this post.

C++

 `// C++ implementation to find the length of the longest ` `// subarray having maximum sum ` `#include ` `using` `namespace` `std; ` ` `  `// function to find the maximum sum that ` `// exists in a subarray ` `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; ` `} ` ` `  `// function to find the length of longest ` `// subarray having sum k ` `int` `lenOfLongSubarrWithGivenSum(``int` `arr[], ``int` `n, ``int` `k) ` `{ ` `    ``// unordered_map 'um' implemented ` `    ``// as hash table ` `    ``unordered_map<``int``, ``int``> um; ` `    ``int` `sum = 0, maxLen = 0; ` ` `  `    ``// traverse the given array ` `    ``for` `(``int` `i = 0; i < n; i++) { ` ` `  `        ``// accumulate sum ` `        ``sum += arr[i]; ` ` `  `        ``// when subarray starts from index '0' ` `        ``if` `(sum == k) ` `            ``maxLen = i + 1; ` ` `  `        ``// make an entry for 'sum' if it is ` `        ``// not present in 'um' ` `        ``if` `(um.find(sum) == um.end()) ` `            ``um[sum] = i; ` ` `  `        ``// check if 'sum-k' is present in 'um' ` `        ``// or not ` `        ``if` `(um.find(sum - k) != um.end()) { ` ` `  `            ``// update maxLength ` `            ``if` `(maxLen < (i - um[sum - k])) ` `                ``maxLen = i - um[sum - k]; ` `        ``} ` `    ``} ` ` `  `    ``// required maximum length ` `    ``return` `maxLen; ` `} ` ` `  `// function to find the length of the longest ` `// subarray having maximum sum ` `int` `lenLongSubarrWithMaxSum(``int` `arr[], ``int` `n) ` `{ ` `    ``int` `maxSum = maxSubArraySum(arr, n); ` `    ``return` `lenOfLongSubarrWithGivenSum(arr, n, maxSum); ` `} ` ` `  `// Driver program to test above ` `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

 `// Java implementation to find ` `// the length of the longest  ` `// subarray having maximum sum  ` `import` `java.util.*; ` ` `  `class` `GFG ` `{ ` `// function to find the ` `// maximum sum that  ` `// exists in a subarray  ` `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;  ` `}  ` ` `  `// function to find the  ` `// length of longest  ` `// subarray having sum k  ` `static` `int` `lenOfLongSubarrWithGivenSum(``int` `arr[], ` `                                       ``int` `n, ``int` `k)  ` `{  ` `    ``// unordered_map 'um' implemented  ` `    ``// as hash table  ` `    ``HashMap um = ``new` `HashMap();  ` `    ``int` `sum = ``0``, maxLen = ``0``;  ` ` `  `    ``// traverse the given array  ` `    ``for` `(``int` `i = ``0``; i < n; i++)  ` `    ``{  ` ` `  `        ``// accumulate sum  ` `        ``sum += arr[i];  ` ` `  `        ``// when subarray starts ` `        ``// from index '0'  ` `        ``if` `(sum == k)  ` `            ``maxLen = i + ``1``;  ` ` `  `        ``// make an entry for 'sum' if  ` `        ``// it is not present in 'um'  ` `        ``if` `(um.containsKey(sum))  ` `            ``um.put(sum, i);  ` ` `  `        ``// check if 'sum-k' is present  ` `        ``// in 'um' or not  ` `        ``if` `(um.containsKey(sum - k)) ` `        ``{  ` ` `  `            ``// update maxLength  ` `            ``if` `(maxLen < (i - um.get(sum - k)))  ` `                ``maxLen = i - um.get(sum - k);  ` `        ``}  ` `    ``}  ` ` `  `    ``// required maximum length  ` `    ``return` `maxLen;  ` `}  ` ` `  `// function to find the length  ` `// of the longest subarray ` `// having maximum sum  ` `static` `int` `lenLongSubarrWithMaxSum(``int` `arr[], ``int` `n)  ` `{  ` `    ``int` `maxSum = maxSubArraySum(arr, n);  ` `    ``return` `lenOfLongSubarrWithGivenSum(arr, n, maxSum);  ` `}  ` ` `  `// Driver Code ` `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));  ` `}  ` `} ` ` `  `// This code is contributed by Arnab Kundu `

Python3

 `# Python3 implementation to find the length  ` `# of the longest subarray having maximum sum ` ` `  `# function to find the maximum sum that ` `# exists in a subarray ` `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 ` ` `  `# function to find the length of longest ` `# subarray having sum k ` `def` `lenOfLongSubarrWithGivenSum(arr, n, k): ` ` `  `    ``# unordered_map 'um' implemented ` `    ``# as hash table ` `    ``um ``=` `dict``() ` `    ``Sum``, maxLen ``=` `0``, ``0` ` `  `    ``# traverse the given array ` `    ``for` `i ``in` `range``(n): ` ` `  `        ``# accumulate Sum ` `        ``Sum` `+``=` `arr[i] ` ` `  `        ``# when subarray starts from index '0' ` `        ``if` `(``Sum` `=``=` `k): ` `            ``maxLen ``=` `i ``+` `1` ` `  `        ``# make an entry for 'Sum' if it is ` `        ``# not present in 'um' ` `        ``if` `(``Sum` `not` `in` `um.keys()): ` `            ``um[``Sum``] ``=` `i ` ` `  `        ``# check if 'Sum-k' is present in 'um' ` `        ``# or not ` `        ``if` `(``Sum` `in` `um.keys()): ` ` `  `            ``# update maxLength ` `            ``if` `((``Sum` `-` `k) ``in` `um.keys() ``and`  `                 ``maxLen < (i ``-` `um[``Sum` `-` `k])): ` `                ``maxLen ``=` `i ``-` `um[``Sum` `-` `k] ` ` `  `    ``# required maximum length ` `    ``return` `maxLen ` ` `  `# function to find the length of the longest ` `# subarray having maximum Sum ` `def` `lenLongSubarrWithMaxSum(arr, n): ` ` `  `    ``maxSum ``=` `maxSubArraySum(arr, n) ` `    ``return` `lenOfLongSubarrWithGivenSum(arr, n, maxSum) ` ` `  `# Driver Code ` `arr ``=` `[``5``, ``-``2``, ``-``1``, ``3``, ``-``4``] ` `n ``=` `len``(arr) ` `print``(``"Length of longest subarray having maximum sum = "``,  ` `                         ``lenLongSubarrWithMaxSum(arr, n)) ` `  `  `# This code is contributed by mohit kumar `

C#

 `// C# implementation to find  ` `// the length of the longest  ` `// subarray having maximum sum  ` `using` `System; ` `using` `System.Collections.Generic; ` `public` `class` `GFG{  ` `    ``// function to find the  ` `    ``// maximum sum that  ` `    ``// exists in a subarray  ` `    ``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;  ` `    ``}  ` ` `  `    ``// function to find the  ` `    ``// length of longest  ` `    ``// subarray having sum k  ` `    ``static` `int` `lenOfLongSubarrWithGivenSum(``int` `[]arr,  ` `                                        ``int` `n, ``int` `k)  ` `    ``{  ` `        ``// unordered_map 'um' implemented  ` `        ``// as hash table  ` `        ``Dictionary<``int``,  ` `                ``int``> um = ``new` `Dictionary<``int``,  ` `                                        ``int``>();  ` `        ``int` `sum = 0, maxLen = 0;  ` ` `  `        ``// traverse the given array  ` `        ``for` `(``int` `i = 0; i < n; i++)  ` `        ``{  ` ` `  `            ``// accumulate sum  ` `            ``sum += arr[i];  ` ` `  `            ``// when subarray starts  ` `            ``// from index '0'  ` `            ``if` `(sum == k)  ` `                ``maxLen = i + 1;  ` ` `  `            ``// make an entry for 'sum' if  ` `            ``// it is not present in 'um'  ` `            ``if` `(um.ContainsKey(sum))  ` `                ``um.Add(sum, i);  ` ` `  `            ``// check if 'sum-k' is present  ` `            ``// in 'um' or not  ` `            ``if` `(um.ContainsKey(sum - k))  ` `            ``{  ` ` `  `                ``// update maxLength  ` `                ``if` `(maxLen < (i - um[sum - k]))  ` `                    ``maxLen = i - um[sum - k];  ` `            ``}  ` `        ``}  ` ` `  `        ``// required maximum length  ` `        ``return` `maxLen;  ` `    ``}  ` ` `  `    ``// function to find the length  ` `    ``// of the longest subarray  ` `    ``// having maximum sum  ` `    ``static` `int` `lenLongSubarrWithMaxSum(``int` `[]arr, ``int` `n)  ` `    ``{  ` `        ``int` `maxSum = maxSubArraySum(arr, n);  ` `        ``return` `lenOfLongSubarrWithGivenSum(arr, n, maxSum);  ` `    ``}  ` ` `  `    ``// Driver Code  ` `    ``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));  ` `    ``}  ` `}  ` ` `  `// This code is contributed by Rajput-Ji `

Output:

```Length of longest subarray having maximum sum = 4
```

Time Complexity: O(n).
Auxiliary Space: O(n).

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.