diff --git a/data structures/array/Maximum-Subarray-Sum/KADANE'S_ALGORITHM/C++/Kadane's_algorithm.c++ b/data structures/array/Maximum-Subarray-Sum/KADANE'S_ALGORITHM/C++/Kadane's_algorithm.c++ new file mode 100644 index 000000000..a864cc083 --- /dev/null +++ b/data structures/array/Maximum-Subarray-Sum/KADANE'S_ALGORITHM/C++/Kadane's_algorithm.c++ @@ -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 +#include +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 +