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));
}
}