九章算法官网-原文网址
http://www.jiuzhang.com/problem/31/
题目
给定一个数组,求两个不相交的并且是连续的子数组A和B(位置连续),满足|sum(A) - sum(B)|最大(和之差的绝对值)。例如[2, -1, -2, 1, -4, 2, 8],可以得到A=[-1, -2, 1, -4], B=[2, 8],最大差为16。
解答
预处理每个位置往左/右的最大/最小子数组,然后再枚举划分位置,求得所有MaxLeft[i] - MinRight[i+1]和MaxRight[i+1] - MinLeft[i]中的最大值,即为答案。预处理O(n),枚举划分位置O(n),整体O(n)。
面试官角度
在《九章算法面试题12 最大子区间/子矩阵》中,我们介绍了在O(n)时间内求得最大子数组(子区间)的方法,在这个题目中,实际上是通过枚举划分位置(AB两个数组中间的间隔)来将求两个数组之差最大的问题变为了求某个数组最大/最小子数组的问题。最小子数组只需要将每个数取相反数则可用最大子数组的方法来求得。
仔细考虑本题,实际上A数组和B数组一定是相邻数组,因为假设A和B之间存在一段数字,假设和为C,如果C>0则可以加入A和B中较大的一边让差变得更大,如果C<0,则加入较小的一边也可以让差变得更大,如果C=0,加入A或者B都不会影响结果。因此,只需要计算每个位置开始往左取到的最大/最小小连续和与往右取到的最大/最小连续和,即可得到答案。
时间: 2024-10-06 11:20:52