环形数组求最大子数组和

数组是环形的,即首尾相接(下标n-1的元素后面的元素下标为0),求最大子数组和
环形数组求最大子数组和


解法一:
把该环形数组从某一点展开,连写两遍(复制一份接到自己后面),然后当成无环的数组求最大子数组和,但这里要限制一个条件,就是最大子数组的长度不可以超过n,所以求的时候要注意判断。
例如:上图中展开写两遍为a1,a2,a3,a4,a1,a2,a3,a4。
这种情况下限定最大子数组的长度不可以超过n的作用:假如数组为{-1,2,3,4},则展开复制一份接到自己后面为-1,2,3,4,-1,2,3,4,此时若直接求则为2,3,4,-1,2,3,4,很明显不对了,所以要限定最大子数组的长度不可以超过n。


解法二:
这个问题的最优解一定是以下两种可能。
可能一:最优解没有跨过a[n-1]到a[0],即和非环形数组一样了。
可能二:最优解跨过a[n-1]到a[0],新问题。
对于第一种情况,我们可以按照非环形数组求法来求,为max1;对于第二种情况,可以将原问题转化为数组的最小子数组和问题,再用数组全部元素的和减去最小子数组和,那么结果一定是跨过a[n-1]到a[0]情况中最大的子数组和,设为max2。最终结果即为max1与max2中较大的那个。
例1:有数组6、-1、-6、8、2
求得max1=10,max2=16,则取较大的max2作为结果。
例2:有数组-6、8、2、6、-1
求得max1=16,max2=15,则取较大的max1作为结果。
为什么这样求:数组元素“sum - 最小子数组和 = 跨过a[n-1]到a[0]情况中的最大子数组和”这一点有些疑问。我们可以这样理解:n个数的和是一定的,那么如果我们在这n个数中找到连续的一段数,并且这段数是所有连续的数的和最小的,那么“sum-最小子段和”的结果一定最大。故求得:跨过a[n-1]到a[0]情况中的最大子数组和。

猜你喜欢

转载自blog.csdn.net/zlsjsj/article/details/80929160