子序列
该模板的功能:求出最大连续子序列的和,并保存该连续子序列的开头和结尾元素的编号,这里,我们默认第一个元素的编号是1。
int num[MAXNUM];
int arrLen;
int startPos, endPos;
int maxSubArray()
{
int sum = 0;
int Max = -inf;
int tempPos = 1;
for(int i=1;i<=arrLen;i++)
{
sum += num[i];
if(sum>Max)
{
Max = sum;
startPos = tempPos;
endPos = i;
}
if(sum<0)
{
sum = 0;
tempPos = i+1;
}
}
return Max;
}
注:tempPos用于保存当前数组的编号,这个编号是可以改变的。我们的思路是:如子序列的和小于零的时 候对tempPos进行更新操作,为什么是这样一个思路呢?
举个例子:比如说数组 3,-5,-3, -4, 6.上述代码进入i=2时,sum = 3+(-5)为-2,这个时候tempPos更新为3,也就是说在之后的寻找子序列的过程中要首先从编号为3的数组开始考虑,在这个例子中-5之后的数字为负数,负数加上负数只能是越加越少。如果是这样的一个数组:3,-5,4,3, -4, 6 即:-5之后为一个正数,那么此时sum为负数,sum+4的值也肯定比4要小。综上:我们只在sum小于零的情况下,对tempPos进行更新
在这里插入代码片