天天看点

数组的连续子数组最大和(首尾相连)

题目:

求一个循环数组的连续子数组的最大和。

解法:

《编程之美》上给出一种方法:

1)求[0, n-1]的最大和;

2)如果跨过了n-1,则计算以n-1为尾部的最大子数组[i, n-1],以0为开始的最大子数组[0 , j];

如果i<=j,则M = a[0]+...+a[n-1];

否则,M= a[0]+...+a[j] + a[i]+...a[n-1].

该方法有问题:

例如,1 7 -3 6 2

以2结束的为全串,以1开始的为全串,有M=全加和。

但,我们可以看到,最大应该为6 2 1 7.

因此,我们可以这样做:

1 7 -3 6 2 1 7 -3 6 2

这样做一次连接,第二种情况先计算以n-1为尾部的最大子数组[i, n-1],以0为开始的最大子数组[0 , j];

然后,如果i<=j,则从i开始,找出长度小于数组长度的最大和即可。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/wangicter/archive/2012/10/20/4767269.html