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

Popular posts from this blog

Sudoku

Longest prefix matching - trie

Climbing Stairs