分治法
最大子数组
运用分治策略:时间复杂度O(NlogN) 运用DP策略:线性时间O(N)
int FindMaxCrossSubarray(vector <int > &arr, int low, int mid, int high){
int left_sum=INT_MIN;
int right_sum=INT_MIN;
int sum=0 ;
for (int i=mid;i>=low;i--){
sum+=arr[i];
if (sum>left_sum) left_sum=sum;
}
sum=0 ;
for (int i=mid+1 ;i<=high;i++){
sum+=arr[i];
if (sum>right_sum) right_sum=sum;
}
return left_sum+right_sum;
}
int FindMaxSubarray(vector <int > &arr, int low, int high){
int left_sum=0 ;
int right_sum=0 ;
int cross_sum=0 ;
if (high==low) return arr[low];
else {
int mid=(high+low)/2 ;
left_sum=FindMaxSubarray(arr, low, mid);
right_sum=FindMaxSubarray(arr, mid+1 , high);
cross_sum=FindMaxCrossSubarray(arr, low, mid, high);
if (left_sum>=cross_sum && left_sum>=right_sum) return left_sum;
else if (right_sum>=cross_sum && right_sum>=left_sum) return right_sum;
else return cross_sum;
}
}
int FindMaxSubarray(vector <int > &arr){
int sum=0 ;
int ans=INT_MIN;
for (int i=0 ;i<arr.size();i++){
sum+=arr[i];
ans=max(sum,ans);
sum=max(sum,0 );
}
return ans;
}