连续子数组最大和
题目
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
输入 :[1,-2,3,10,-4,7,2,-5]
输入 :18
思路: 该题的关键在于何时生成子数组
自底向上分析:
第一次得到数组[1], sum = 1, max = 1
第二次得到数组[-2], 此时划分了子数组,如果-2加入上一个数组, 数组的和sum就为负数, 对其他的数组元素就没有了增
强的作用,所以需要划分子数组。划分数组以后就需要判断前后两个数组和,谁最大。sum = -2,
第三次得到数组[3], 此时也划分了子数组,如果3 加入上一个数组,虽然数组和不为负数,但是,上一个数组的和拖累了
当前元素array[i] 即3,所以也需要划分子数组。sum = 3 大于max ,max更新=3。
第四次得到数组[3, 10], sum = 13, max更新,max=13
第五次得到数组[3, 10, -4], sum = 9.
........
最终得到数组[3, 10, -4, 7, 2, -5]; sum = 13, max = 18
#include<iostream>
using namespace std;
int FindGreatestSumOfSubArray(int* array, int arrayLen ) {
int max = array[0],
arraySum = array[0];
int i, j;
for(i = 1; i < arrayLen; i ++){
if(arraySum + array[i] >= 0 && arraySum >= 0){
arraySum += array[i];
if(arraySum > max){
max = arraySum;
}
}else{
max = array[i] > max ? array[i] : max;
arraySum = array[i];
}
}
return max;
}
int main(){
int arry[] = {-1,-2,-3,-10,-4,-7,-2,-5};
cout << FindGreatestSumOfSubArray(arry, 8);
return 0;
}