-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1310 from zahinekbal/zahinekbal
Added kadane's_algorithm By zahinekbal
- Loading branch information
Showing
1 changed file
with
101 additions
and
0 deletions.
There are no files selected for viewing
101 changes: 101 additions & 0 deletions
101
data structures/array/Maximum-Subarray-Sum/KADANE'S_ALGORITHM/C++/Kadane's_algorithm.c++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/*Largest Sum Contiguous Subarray | ||
Write an efficient program to find the sum of contiguous subarray within a one-dimensional | ||
array of numbers which has the largest sum. | ||
Largest Subarray Sum Problem:- | ||
-2 -3 4 -1 -2 1 5 -3 | ||
=>4 + (-1) + (-2) + 1 + 5 = 7 | ||
Maximum contiguous array sum is = 7; | ||
Kadane’s Algorithm: | ||
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: | ||
|
||
//KADANE'S algorithm is able to find the MaximumSum of a Contiguous Subarray in array with the runtime of O(n)... | ||
// C++ program to print largest contiguous array sum | ||
#include<iostream> | ||
#include<climits> | ||
using namespace std; | ||
|
||
int maxSubArraySum(int a[], int size) | ||
{ | ||
int max_so_far = INT_MIN, max_ending_here = 0; | ||
|
||
for (int 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 program to test maxSubArraySum*/ | ||
int main() | ||
{ | ||
int a[] = {-2, -3, 4, -1, -2, 1, 5, -3}; | ||
int n = sizeof(a)/sizeof(a[0]); | ||
int max_sum = maxSubArraySum(a, n); | ||
cout << "Maximum contiguous sum is " << max_sum; | ||
return 0; | ||
} | ||
|
||
//Output: | ||
//Maximum contiguous sum is 7 | ||
|