(1). 记录最小子数组方法
int MaxSubArray(vector<int> &a){
int sum = a[0];
int minsum = min(0,sum);
int max_sub_array = sum;
for(int i = 1; i < a.size(); i++){
sum += a[i];
max_sub_array = max(max_sub_array,sum - minsum);
minsum = min(minsum,sum);
}
return max_sub_array;
}
(2). 动态规划
//DP
int MaxSubArray_DP(vector<int> &a){
int endhere = a[0];
int max_sub_array = a[0];
for(int i = 1; i < a.size(); i++){
endhere = max(endhere + a[i],a[i]);
max_sub_array = max(max_sub_array,endhere);
}
return max_sub_array;
}
(3). 循环最大子数组和
//循环数组的最大子数组和
int MaxLoopSubArray(const vector<int> &a){
int sum = 0;
int endMax = a[0];
int endMin = a[0];
int max_sub_array = a[0];
int min_sub_array = a[0];
for(int i = 1; i < a.size(); i++){
endMax = max(endMax + a[i],a[i]);
endMax = min(endMin + a[i],a[i]);
max_sub_array = max(max_sub_array,endMax);
min_sub_array = min(min_sub_array,endMax);
}
return max(max_sub_array,( sum - (min_sub_array>0):(min_sub_array):(-min_sub_array) ));
}