求子数组之和的最大值采用之前的博客编程之美2.14 求数组的子数组之和的最大值中的动态规划方法,时间复杂度为O(N),在求nAll的过程中,记录子数组和最大值的那个数组的起始位置start跟终止位置end,下面的源码也分成了两种情况处理,一种情况是数组元素全为负的时候返回最大的负数,数组中除了0就是负数的情况则返回最后一次出现的那个0所在的位置(对应于程序的define RETURN_MAXMINUS块);另外一种情况是数组元素全为负数的时候返回0并置start跟end为-1,数组中除了0就是负数的情况则返回第一次出现的那个0所在的位置(对应于define RETURN_ZERO块)。
小插曲:
在main函数中有如下代码
/**下面的语句有问题**/
/*
start=end=-1;
cout<<MaxSum(a,6,start,end)<<start<<end<<endl;
start=end=-1;
cout<<start<<end<<MaxSum(a,6,start,end)<<start<<end<<endl;*/
start=end=-1; cout<<MaxSum(a,6,start,end)<<start<<end<<endl;的输出结果中start跟end的结果是-1 -1
而代码
start=-1;
end=-1;
sum=MaxSum(a,6,start,end);
cout<<"子数组和: "<<sum<<" 起始位置: "<<start<<" 终止位置: "<<end<<endl;
的输出结果start跟end为2 3
究其原因,通过反编译看出对cout<<MaxSum(a,6,start,end)<<start<<end<<endl来说,输出流的参数是从右到左进栈,先end(值为-1)进栈,然后start(值为-1)进栈,然后再将MaxSum的结果进栈(此时start为2,end为3),但是输出结果的时候start跟end还是输出进栈时候的start跟end的值。
做进一步测试,假设有如下语句:
cout<<start<<end<<MaxSum(a,6,start,end)<<start<<end<<endl;
则输出结果为2 3 8 -1 -1则左边的start end的值为正确值,右边的start end输出的是函数调用前的值