int max_subarray(int low, int high, vector<int>& nums){
        if (low == high)
            return max(nums[low],0);
        int mid = (low +high)/2;
        int left_sum = max_subarray(low, mid, nums);
        int right_sum = max_subarray(mid+1, high, nums);
        int cross_sum = max_cross_subarray(low, mid, high, nums);
        if ((left_sum >= right_sum) && (left_sum >= cross_sum)) return left_sum;
        if ((left_sum <= right_sum) && (cross_sum <= right_sum)) return right_sum;
        else return cross_sum;

    }
Ejemplo n.º 2
0
void max_subarray(int *arr, int low, int high, int *lo, int *hi, int *sum)
{
	if(low==high){
		*lo=low;
		*hi=high;
		*sum=arr[low];
		return;
	}
	else{
		int mid=(low+high)/2;
		int lftlo, lfthi, lftsum;
		int rtlo, rthi, rtsum;
		int crosslo, crosshi, crosssum;

		max_subarray(arr,low,mid,&lftlo,&lfthi,&lftsum);
		max_subarray(arr,mid+1,high,&rtlo,&rthi,&rtsum);
		max_cross_subarray(arr,low,mid,high,&crosslo,&crosshi,&crosssum);		

		if(lftsum>=rtsum&&lftsum>=crosssum)
		{
			*lo=lftlo;
			*hi=lfthi;
			*sum=lftsum;
			return;
		}
		else if(rtsum>=lftsum&&rtsum>=crosssum)
		{
			*lo=rtlo;
			*hi=rthi;
			*sum=rtsum;
			return;
		}
		else{

			*lo=crosslo;
			*hi=crosshi;
			*sum=crosssum;
			return;
		}
	}
}