コード例 #1
0
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;
	}
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
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;
	}
}
コード例 #5
0
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);
	}
}
コード例 #6
0
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;
	}
}
コード例 #7
0
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;
    }
  }
}
コード例 #8
0
int maxSubArray(int* nums, int numsSize) {
    return FindMaxSubArray(nums,0,numsSize-1);
}