求子数组的最大和

穷举法:

int MaxSubArraySum(int a[], int n)

{

int i, j, MaxSum = 0, tmpSum, cnt;

 

for (i=1; i<=n; i++)

{

for (j=0; j+i<=n; j++)

{

cnt = 0;

tmpSum = 0;

while (cnt < i)

{

tmpSum += a[j+cnt];

cnt++;

}

if (MaxSum < tmpSum)

{

MaxSum = tmpSum;

}

}

}

 

return MaxSum;

}

 

通过循环嵌套,控制步长,求出所有的子数组的值

 

找出规律法:

int MaxSub(int a[], int n)

{

int sum = 0, tmpSum = 0;

int i;

 

for (i=0; i<n; i++)

{

if (tmpSum <= 0)

{

tmpSum = a[i];

}

else

{

tmpSum += a[i];

}

if (sum < tmpSum)

{

sum = tmpSum;

}

}

 

return sum;

}

 

这个代码就简洁了很多,时间复杂度也达到了题目要求的O(n)

写出这种算法的关键在于,弄清楚当子数组的和小于0时就可以舍弃掉,从下一个元素开始计算子数组和了。

posted @ 2013-11-02 17:21  SLVR  阅读(161)  评论(0编辑  收藏  举报