您的位置:首页 > 其它

[数字技巧]最大连续子序列和

2013-09-09 12:48 302 查看
  最大连续子序列和这个问题是一个比较常见的问题,出现在很多公司的面试笔试中。题目大概是这样描述的:

  输入一个整形数组,数组中有正数也有负数,数组中连续一个或多个组成一个子序列,每个子序列都有一个和,求所有子序列的和的最大值。

  一、暴力枚举

  最暴力的解法是枚举起点和终点(或长度),连同求和的那个步骤,共三个for循环,复杂度是O(n3)。代码示例如下:

int solve3(int *arr,int n)
{
long max = 0;
long total = 0;
for(int i=0; i<n; i++){
total += arr[i];
if(total > max)
max =  total;
else if(total < 0)
total = 0;
}
return max;
}


View Code
  这是一个线性时间常量空间的算法,最大的特点是一旦读入arr[i]就被立即处理,不再被记忆,这就是所谓的联机算法。

  四、巧妙解法的两个改进

    改进一、这种算法在数组中所有的数为负数时,是得不到正确结果的,通过对负数单独讨论,满足全负数情形;

    改进二、在计算的过程中忽略了起始位置和终点位置,可通过做两次标记,保存起点和终点位置。

    这里直接给出一道类似的题目,具体不在赘述。

    /article/5796794.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: