Largest Sum
/***
You are given an array of integers (both positive and negative). Find the
contigous sequence with the largest sum. Return the sum.
EXAMPLE:
Input: 2, -8, 3, -2, 4, -10
Ouput: 5 (3, -2, 4)
***/
#include<iostream>
#include<algorithm>
using namespace std;
int getMax(int a, int b, int c) {
return max(a, max(b, c));
}
int middleSum(int *a, int begin, int end) {
int midSum;
int mid = (begin + end) / 2;
int left = 0, right = 0;
midSum = a[mid] + a[mid+1];
for(int i = begin; i<mid; i++) {
if (left < 0) left = a[i];
else left += a[i];
}
for(int j = end; j>mid+1; j--) {
if (right < 0) right = a[j];
else right += a[j];
}
if(left > 0) midSum += left;
if(right > 0) midSum +=right;
return midSum;
}
int largeSum(int *a, int begin, int end) {
int midsum, leftsum, rightsum, largesum;
int mid = (begin + end) / 2;
//base case
if(begin == end) return a[end];
if(begin == end-1) {
if(min(a[begin], a[end]) > 0)
return a[begin]+a[end];
else return max(a[begin], a[end]);
}
leftsum = largeSum(a, begin, mid);
rightsum = largeSum(a, mid+1, end);
midsum = middleSum(a, begin, end);
return getMax(leftsum, rightsum, midsum);
}
void main() {
int a[] = {2, -8, 3, -1, -1, 5, 4, -10};
int sz = sizeof(a) / sizeof(int);
cout << largeSum(a, 0, sz-1)<<endl;
}
Comments
Post a Comment