Initialize:
max_so_far = 0
max_ending_here = 0
Loop for each element of the array
(a) max_ending_here = max_ending_here + a[i]
(b) if(max_so_far < max_ending_here)
max_so_far = max_ending_here
(c) if(max_ending_here < 0)
max_ending_here = 0
return max_so_far
Explanation:
Simple idea of the Kadane’s algorithm is to look for all positive contiguous segments of the array (max_ending_here is used for this). And keep track of maximum sum contiguous segment among all positive segments (max_so_far is used for this). Each time we get a positive sum compare it with max_so_far and update max_so_far if it is greater than max_so_far
Lets take the example:
{-2, -3, 4, -1, -2, 1, 5, -3}
max_so_far = max_ending_here = 0
for i=0, a[0] = -2
max_ending_here = max_ending_here + (-2)
Set max_ending_here = 0 because max_ending_here < 0
for i=1, a[1] = -3
max_ending_here = max_ending_here + (-3)
Set max_ending_here = 0 because max_ending_here < 0
for i=2, a[2] = 4
max_ending_here = max_ending_here + (4)
max_ending_here = 4
max_so_far is updated to 4 because max_ending_here greater
than max_so_far which was 0 till now
for i=3, a[3] = -1
max_ending_here = max_ending_here + (-1)
max_ending_here = 3
for i=4, a[4] = -2
max_ending_here = max_ending_here + (-2)
max_ending_here = 1
for i=5, a[5] = 1
max_ending_here = max_ending_here + (1)
max_ending_here = 2
for i=6, a[6] = 5
max_ending_here = max_ending_here + (5)
max_ending_here = 7
max_so_far is updated to 7 because max_ending_here is
greater than max_so_far
for i=7, a[7] = -3
max_ending_here = max_ending_here + (-3)
max_ending_here = 4
Program:
C++
filter_none
edit close
play_arrow
link brightness_4 code
// C++ program to print largest contiguous array sum
#include<iostream>
#include<climits>
usingnamespacestd;
intmaxSubArraySum(inta[], intsize)
{
intmax_so_far = INT_MIN, max_ending_here = 0;
for(inti = 0; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if(max_so_far < max_ending_here)
max_so_far = max_ending_here;
if(max_ending_here < 0)
max_ending_here = 0;
}
returnmax_so_far;
}
/*Driver program to test maxSubArraySum*/
intmain()
{
inta[] = {-2, -3, 4, -1, -2, 1, 5, -3};
intn = sizeof(a)/sizeof(a[0]);
intmax_sum = maxSubArraySum(a, n);
cout << "Maximum contiguous sum is "<< max_sum;
return0;
}
chevron_right
filter_none
Java
filter_none
edit close
play_arrow
link brightness_4 code
importjava.io.*;
// Java program to print largest contiguous array sum
print"Maximum contiguous sum is", maxSubArraySum(a,len(a))
#This code is contributed by _Devesh Agrawal_
chevron_right
filter_none
C#
filter_none
edit close
play_arrow
link brightness_4 code
// C# program to print largest
// contiguous array sum
usingSystem;
classGFG
{
staticintmaxSubArraySum(int[]a)
{
intsize = a.Length;
intmax_so_far = int.MinValue,
max_ending_here = 0;
for(inti = 0; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if(max_so_far < max_ending_here)
max_so_far = max_ending_here;
if(max_ending_here < 0)
max_ending_here = 0;
}
returnmax_so_far;
}
// Driver code
publicstaticvoidMain ()
{
int[] a = {-2, -3, 4, -1, -2, 1, 5, -3};
Console.Write("Maximum contiguous sum is "+
maxSubArraySum(a));
}
}
// This code is contributed by Sam007_
chevron_right
filter_none
PHP
filter_none
edit close
play_arrow
link brightness_4 code
<?php
// PHP program to print largest
// contiguous array sum
functionmaxSubArraySum($a, $size)
{
$max_so_far= PHP_INT_MIN;
$max_ending_here= 0;
for($i= 0; $i< $size; $i++)
{
$max_ending_here= $max_ending_here+ $a[$i];
if($max_so_far< $max_ending_here)
$max_so_far= $max_ending_here;
if($max_ending_here< 0)
$max_ending_here= 0;
}
return$max_so_far;
}
// Driver code
$a= array(-2, -3, 4, -1,
-2, 1, 5, -3);
$n= count($a);
$max_sum= maxSubArraySum($a, $n);
echo"Maximum contiguous sum is ",
$max_sum;
// This code is contributed by anuj_67.
?>
chevron_right
filter_none
Output:
Maximum contiguous sum is 7
Above program can be optimized further, if we compare max_so_far with max_ending_here only if max_ending_here is greater than 0.
C++
filter_none
edit close
play_arrow
link brightness_4 code
intmaxSubArraySum(inta[], intsize)
{
intmax_so_far = 0, max_ending_here = 0;
for(inti = 0; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if(max_ending_here < 0)
max_ending_here = 0;
/* Do not compare for all elements. Compare only
when max_ending_here > 0 */
elseif(max_so_far < max_ending_here)
max_so_far = max_ending_here;
}
returnmax_so_far;
}
chevron_right
filter_none
Java
filter_none
edit close
play_arrow
link brightness_4 code
staticintmaxSubArraySum(inta[],intsize)
{
intmax_so_far = 0, max_ending_here = 0;
for(inti = 0; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if(max_ending_here < 0)
max_ending_here = 0;
/* Do not compare for all
elements. Compare only
when max_ending_here > 0 */
elseif(max_so_far < max_ending_here)
max_so_far = max_ending_here;
}
returnmax_so_far;
}
// This code is contributed by ANKITRAI1
chevron_right
filter_none
Python
filter_none
edit close
play_arrow
link brightness_4 code
defmaxSubArraySum(a,size):
max_so_far =0
max_ending_here =0
fori inrange(0, size):
max_ending_here =max_ending_here +a[i]
ifmax_ending_here < 0:
max_ending_here =0
# Do not compare for all elements. Compare only
# when max_ending_here > 0
elif(max_so_far < max_ending_here):
max_so_far =max_ending_here
returnmax_so_far
chevron_right
filter_none
C#
filter_none
edit close
play_arrow
link brightness_4 code
staticintmaxSubArraySum(int[] a,
intsize)
{
intmax_so_far = 0,
max_ending_here = 0;
for(inti = 0; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if(max_ending_here < 0)
max_ending_here = 0;
/* Do not compare for all
elements. Compare only
when max_ending_here > 0 */
elseif(max_so_far < max_ending_here)
max_so_far = max_ending_here;
}
returnmax_so_far;
}
// This code is contributed
// by ChitraNayal
chevron_right
filter_none
PHP
filter_none
edit close
play_arrow
link brightness_4 code
<?php
functionmaxSubArraySum(&$a, $size)
{
$max_so_far= 0;
$max_ending_here= 0;
for($i= 0; $i< $size; $i++)
{
$max_ending_here= $max_ending_here+ $a[$i];
if($max_ending_here< 0)
$max_ending_here= 0;
/* Do not compare for all elements.
Compare only when max_ending_here > 0 */
elseif($max_so_far< $max_ending_here)
$max_so_far= $max_ending_here;
}
return$max_so_far;
// This code is contributed
// by ChitraNayal
?>
chevron_right
filter_none
Time Complexity: O(n) Algorithmic Paradigm: Dynamic Programming
Following is another simple implementation suggested by Mohit Kumar. The implementation handles the case when all numbers in array are negative.
C++
filter_none
edit close
play_arrow
link brightness_4 code
#include<iostream>
usingnamespacestd;
intmaxSubArraySum(inta[], intsize)
{
intmax_so_far = a[0];
intcurr_max = a[0];
for(inti = 1; i < size; i++)
{
curr_max = max(a[i], curr_max+a[i]);
max_so_far = max(max_so_far, curr_max);
}
returnmax_so_far;
}
/* Driver program to test maxSubArraySum */
intmain()
{
inta[] = {-2, -3, 4, -1, -2, 1, 5, -3};
intn = sizeof(a)/sizeof(a[0]);
intmax_sum = maxSubArraySum(a, n);
cout << "Maximum contiguous sum is "<< max_sum;
return0;
}
chevron_right
filter_none
Java
filter_none
edit close
play_arrow
link brightness_4 code
// Java program to print largest contiguous
// array sum
importjava.io.*;
classGFG {
staticintmaxSubArraySum(inta[], intsize)
{
intmax_so_far = a[0];
intcurr_max = a[0];
for(inti = 1; i < size; i++)
{
curr_max = Math.max(a[i], curr_max+a[i]);
max_so_far = Math.max(max_so_far, curr_max);
}
returnmax_so_far;
}
/* Driver program to test maxSubArraySum */
publicstaticvoidmain(String[] args)
{
inta[] = {-2, -3, 4, -1, -2, 1, 5, -3};
intn = a.length;
intmax_sum = maxSubArraySum(a, n);
System.out.println("Maximum contiguous sum is "
+ max_sum);
}
}
// This code is contributd by Prerna Saini
chevron_right
filter_none
Python
filter_none
edit close
play_arrow
link brightness_4 code
# Python program to find maximum contiguous subarray
defmaxSubArraySum(a,size):
max_so_far =a[0]
curr_max =a[0]
fori inrange(1,size):
curr_max =max(a[i], curr_max +a[i])
max_so_far =max(max_so_far,curr_max)
returnmax_so_far
# Driver function to check the above function
a =[-2, -3, 4, -1, -2, 1, 5, -3]
print"Maximum contiguous sum is", maxSubArraySum(a,len(a))
#This code is contributed by _Devesh Agrawal_
chevron_right
filter_none
C#
filter_none
edit close
play_arrow
link brightness_4 code
// C# program to print largest
// contiguous array sum
usingSystem;
classGFG
{
staticintmaxSubArraySum(int[]a, intsize)
{
intmax_so_far = a[0];
intcurr_max = a[0];
for(inti = 1; i < size; i++)
{
curr_max = Math.Max(a[i], curr_max+a[i]);
max_so_far = Math.Max(max_so_far, curr_max);
}
returnmax_so_far;
}
// Driver code
publicstaticvoidMain ()
{
int[]a = {-2, -3, 4, -1, -2, 1, 5, -3};
intn = a.Length;
Console.Write("Maximum contiguous sum is "
+ maxSubArraySum(a, n));
}
}
// This code is contributed by Sam007_
chevron_right
filter_none
PHP
filter_none
edit close
play_arrow
link brightness_4 code
<?php
functionmaxSubArraySum($a, $size)
{
$max_so_far= $a[0];
$curr_max= $a[0];
for($i= 1; $i< $size; $i++)
{
$curr_max= max($a[$i],
$curr_max+ $a[$i]);
$max_so_far= max($max_so_far,
$curr_max);
}
return$max_so_far;
}
// Driver Code
$a= array(-2, -3, 4, -1,
-2, 1, 5, -3);
$n= sizeof($a);
$max_sum= maxSubArraySum($a, $n);
echo"Maximum contiguous sum is ".
$max_sum;
// This code is contributed
// by Akanksha Rai(Abby_akku)
?>
chevron_right
filter_none
Output:
Maximum contiguous sum is 7
To print the subarray with the maximum sum, we maintain indices whenever we get the maximum sum.
C++
filter_none
edit close
play_arrow
link brightness_4 code
// C++ program to print largest contiguous array sum
#include<iostream>
#include<climits>
usingnamespacestd;
intmaxSubArraySum(inta[], intsize)
{
intmax_so_far = INT_MIN, max_ending_here = 0,
start =0, end = 0, s=0;
for(inti=0; i< size; i++ )
{
max_ending_here += a[i];
if(max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
start = s;
end = i;
}
if(max_ending_here < 0)
{
max_ending_here = 0;
s = i + 1;
}
}
cout << "Maximum contiguous sum is "
<< max_so_far << endl;
cout << "Starting index "<< start
<< endl << "Ending index "<< end << endl;
}
/*Driver program to test maxSubArraySum*/
intmain()
{
inta[] = {-2, -3, 4, -1, -2, 1, 5, -3};
intn = sizeof(a)/sizeof(a[0]);
intmax_sum = maxSubArraySum(a, n);
return0;
}
chevron_right
filter_none
Java
filter_none
edit close
play_arrow
link brightness_4 code
// Java program to print largest
// contiguous array sum
classGFG {
staticvoidmaxSubArraySum(inta[], intsize)
{
intmax_so_far = Integer.MIN_VALUE,
max_ending_here = 0,start = 0,
end = 0, s = 0;
for(inti = 0; i < size; i++)
{
max_ending_here += a[i];
if(max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
start = s;
end = i;
}
if(max_ending_here < 0)
{
max_ending_here = 0;
s = i + 1;
}
}
System.out.println("Maximum contiguous sum is "
+ max_so_far);
System.out.println("Starting index "+ start);
System.out.println("Ending index "+ end);
}
// Driver code
publicstaticvoidmain(String[] args)
{
inta[] = { -2, -3, 4, -1, -2, 1, 5, -3};
intn = a.length;
maxSubArraySum(a, n);
}
}
// This code is contributed by prerna saini
chevron_right
filter_none
Python3
filter_none
edit close
play_arrow
link brightness_4 code
# Python program to print largest contiguous array sum
fromsys importmaxsize
# Function to find the maximum contiguous subarray
# and print its starting and end index
defmaxSubArraySum(a,size):
max_so_far =-maxsize -1
max_ending_here =0
start =0
end =0
s =0
fori inrange(0,size):
max_ending_here +=a[i]
ifmax_so_far < max_ending_here:
max_so_far =max_ending_here
start =s
end =i
ifmax_ending_here < 0:
max_ending_here =0
s =i+1
print("Maximum contiguous sum is %d"%(max_so_far))
print("Starting Index %d"%(start))
print("Ending Index %d"%(end))
# Driver program to test maxSubArraySum
a =[-2, -3, 4, -1, -2, 1, 5, -3]
maxSubArraySum(a,len(a))
chevron_right
filter_none
C#
filter_none
edit close
play_arrow
link brightness_4 code
// C# program to print largest
// contiguous array sum
usingSystem;
classGFG
{
staticvoidmaxSubArraySum(int[]a,
intsize)
{
intmax_so_far = int.MinValue,
max_ending_here = 0, start = 0,
end = 0, s = 0;
for(inti = 0; i < size; i++)
{
max_ending_here += a[i];
if(max_so_far < max_ending_here)
{
max_so_far = max_ending_here;
start = s;
end = i;
}
if(max_ending_here < 0)
{
max_ending_here = 0;
s = i + 1;
}
}
Console.WriteLine("Maximum contiguous "+
"sum is "+ max_so_far);
Console.WriteLine("Starting index "+
start);
Console.WriteLine("Ending index "+
end);
}
// Driver code
publicstaticvoidMain()
{
int[]a = {-2, -3, 4, -1,
-2, 1, 5, -3};
intn = a.Length;
maxSubArraySum(a, n);
}
}
// This code is contributed
// by anuj_67.
chevron_right
filter_none
PHP
filter_none
edit close
play_arrow
link brightness_4 code
<?php
// PHP program to print largest
// contiguous array sum
functionmaxSubArraySum($a, $size)
{
$max_so_far= PHP_INT_MIN;
$max_ending_here= 0;
$start= 0;
$end= 0;
$s= 0;
for($i= 0; $i< $size; $i++)
{
$max_ending_here+= $a[$i];
if($max_so_far< $max_ending_here)
{
$max_so_far= $max_ending_here;
$start= $s;
$end= $i;
}
if($max_ending_here< 0)
{
$max_ending_here= 0;
$s= $i+ 1;
}
}
echo"Maximum contiguous sum is ".
$max_so_far."\n";
echo"Starting index ". $start. "\n".
"Ending index ". $end. "\n";
}
// Driver Code
$a= array(-2, -3, 4, -1, -2, 1, 5, -3);
$n= sizeof($a);
$max_sum= maxSubArraySum($a, $n);
// This code is contributed
// by ChitraNayal
?>
chevron_right
filter_none
Output:
Maximum contiguous sum is 7
Starting index 2
Ending index 6
Now try below question
Given an array of integers (possibly some of the elements negative), write a C program to find out the *maximum product* possible by multiplying ‘n’ consecutive integers in the array where n <= ARRAY_SIZE. Also print the starting point of maximum product subarray.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
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.
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
We use cookies to ensure you have the best browsing experience on our website. By using our site, you
acknowledge that you have read and understood our
Cookie Policy &
Privacy Policy