int FindMaxSubArray(const vector<int>& v, int left, int right,int* i,int* j) { if (left > right) return 0; if (left == right) { *i = *j = left; return v[left]; } int MaxLeft1, MaxRight1,MaxLeft2, MaxRight2,MaxLeft3, MaxRight3; int mid = left + (right - left) / 2; int LeftSum = FindMaxSubArray(v, left, mid, &MaxLeft1, &MaxRight1); int RightSum = FindMaxSubArray(v, mid + 1, right, &MaxLeft2, &MaxRight2); int MidSum = FindMidMaxSum(v, left, mid, right, &MaxLeft3, &MaxRight3); if (LeftSum >= RightSum && LeftSum >= MidSum) { *i = MaxLeft1; *j = MaxRight1; return LeftSum; } else if (RightSum >= LeftSum && RightSum >= MidSum) { *i = MaxLeft2; *j = MaxRight2; return RightSum; } else { *i = MaxLeft3; *j = MaxRight3; return MidSum; } }
int FindMaxSubArray(int* nums, int low, int high) { int lsum,rsum,csum; int mid; if (low == high) { // // Base case. Only 1 element. // return nums[low]; } else { mid = (low+high)/2; lsum = FindMaxSubArray(nums,low,mid); rsum = FindMaxSubArray(nums,mid+1,high); csum = FindCrossMax(nums,low,mid,high); } if (lsum > rsum && lsum > csum) { return lsum; } else if (rsum > lsum && rsum > csum) { return rsum; } return csum; }
int main(int argc, char const *argv[]) { std::vector<int> v; v.push_back(1);v.push_back(1);v.push_back(1);v.push_back(5);v.push_back(1);v.push_back(-1);v.push_back(1); v.push_back(-5); MaxSubArray result = FindMaxSubArray( v , 0 , v.size()); std::cout<< result.low << " " << result.high << " " << result.sum <<std::endl; return 0; }
int calculateMax(vector<int> prices) { int i; vector<int> v; int left, right; for (i = 1;i < prices.size();++i) { v.push_back(prices[i] - prices[i - 1]); cout << prices[i] - prices[i - 1]<<" "; } cout << endl; int sum1=FindMaxSubArray(v, 0, v.size() - 1, &left, &right); int a = left; int b = right; int sum2 = FindMaxSubArray(v, 0, left - 1, &left, &right); left = a; right = b; int sum3 = FindMaxSubArray(v, right, v.size()-1, &left, &right); if (sum1 <= sum2 && sum1 <= sum3) { if (sum2 < 0) return sum3; if (sum3 < 0) return sum2; return sum2 + sum3; } else if (sum2 <= sum1 && sum2 <= sum3) { if (sum1 < 0) return sum3; if (sum3 < 0) return sum1; return sum1 + sum3; } else { if (sum1 < 0) return sum2; if (sum2 < 0) return sum1; return sum1 + sum2; } }
void MaxSubArrayFinder::Find1(std::vector<int>& v, int& start, int& end, int& max_sum) { start = 0; end = 0; max_sum = 0; if (v.size() > 0) { FindMaxSubArray(v, 0, v.size() - 1, start, end, max_sum); } }
void MaxSubArrayFinder::FindMaxSubArray(std::vector<int>& v, int low, int high, int& start, int& end, int& max_sum) { if (low == high) { start = low; end = high; max_sum = v[low]; return; } int mid = (low + high) / 2; int left_start, left_end, left_max_sum; FindMaxSubArray(v, low, mid, left_start, left_end, left_max_sum); int right_start, right_end, right_max_sum; FindMaxSubArray(v, mid + 1, high, right_start, right_end, right_max_sum); int cross_start, cross_end, cross_max_sum; FindMaxCrossingSubArray(v, low, mid, high, cross_start, cross_end, cross_max_sum); if (left_max_sum >= right_max_sum && left_max_sum >= cross_max_sum) { start = left_start; end = left_end; max_sum = left_max_sum; } else if (right_max_sum >= left_max_sum && right_max_sum >= cross_max_sum) { start = right_start; end = right_end; max_sum = right_max_sum; } else { start = cross_start; end = cross_end; max_sum = cross_max_sum; } }
MaxSubArray FindMaxSubArray(std::vector<int> A, int l , int h ){ MaxSubArray ret; int m; if( h <= l ){ //std::cout << "if" << std::endl; ret.low = l; ret.high = h; ret.sum = A[ l ]; ret.profit = A[ 0 ] - A[ h ]; return ret; }else{ //std::cout << "else" << std::endl; m = ( l + h ) / 2; MaxSubArray la = FindMaxSubArray( A , l , m); MaxSubArray ra = FindMaxSubArray( A , m + 1 , h ); //std::cout << "llega" << std::endl; MaxSubArray ca = FindMaxCrossSubArray( A, l , m , h ); //std::cout << "else -- if" << std::endl; if( la.sum >= ra.sum ){ return la; }else if( ra.sum >= la.sum && ra.sum >= ca.sum ){ return ra; }else{ return ca; } } }
int maxSubArray(int* nums, int numsSize) { return FindMaxSubArray(nums,0,numsSize-1); }