题目描述
例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) O(nlogn)
方法一:分治法
class Solution {
private:
int conarray(vector<int> &array, int start, int end){
if(end - start == 1) return array[start];
int mid = start+(end-start)/2;
int rightmax = conarray(array, start, mid), leftmax = conarray(array,mid,end);
int max = rightmax>leftmax?rightmax:leftmax;
int inleft = array[mid-1],leftsum = 0;
for(int i = mid-1;i>=0;i--) {
leftsum += array[i];
inleft = inleft>leftsum?inleft:leftsum;
}
int inright= array[mid],rightsum = 0;
for(int i = mid; i<end;i++) {
rightsum += array[i];
inright = inright>rightsum?inright:rightsum;
}
return max>inright+inleft?max:inright+inleft;
}
public:
int FindGreatestSumOfSubArray(vector<int> array) {
return conarray(array, 0, array.size());
}
};
方法二:dp思想 O(n)
public int FindGreatestSumOfSubArray(int[] array) {
int res = array[0]; //记录当前所有子数组的和的最大值
int max=array[0]; //包含array[i]的连续数组最大值
for (int i = 1; i < array.length; i++) {
max=Math.max(max+array[i], array[i]); //包含最后一个
res=Math.max(max, res); //不包含最后一个,比较最大
}
return res;
}