最大子阵列变化

时间:2012-11-14 19:32:44

标签: average sub-array kadanes-algorithm

我必须像最大的子阵列问题一样解决问题。我必须找到平均值大于k的最大子阵列。我想到了以下技巧。我可以将大小为n的数组A []转换为B [],其中B [i] = A [i] - k。所以现在平均值必须> 0。但平均值大于零并不仅仅意味着总和大于零?所以我可以直接应用Kadane的算法。我对吗? (总是在有1个正值的约束下)

2 个答案:

答案 0 :(得分:4)

不,kadane的算法仍会找到最大总和的子阵列......我必须解决同样的问题。到目前为止,我发现如果我们如上所述创建数组B,然后生成包含数组B的部分和的数组C,那么我们看到的最大间隔(i,j)具有相同的数字对于我和j!例如:

阵列A是:1 10 -1 -1 4 -1 7 2 8 1 .....然后给定的k是5 阵列B为:-4 5 -6 -6 -1 -6 2 -3 3 -4 阵列C为:-4 1 -5 -11 -12 -18 -16 -19 -16 -20 所以我们正在寻找的子阵列是[7,2,8],长度为3,并且具有相同的第一个和最后一个元素,即-16 !!!!

编辑:我忘了告诉我们正在搜索O(n)或O(n * logn)算法.... @lets_solve_it你是对的,但你的算法是O(n ^ 2)whitch是方式为我们想要处理的数据做大。我接近用c ++中的函数map解决它,whitch就像一个哈希表。我认为这是正确的方向,因为这里数组C的元素与它们的索引有直接关系!另外我们的教授告诉我们另一个可能的解决方案是再次制作阵列C,然后采取(特殊?)枢轴进行快速排序......但我并不完全理解我们对快速排序的期望。

答案 1 :(得分:2)

@ panos7:

创建数组C(部分和数组)后,您将寻找C,Ci和Cj两个值,

使得Cj> = Ci,并且(j-i)尽可能“大”。 (j-i) - > MAX。

然后返回j-i。

在你的例子中,-16> = - 18所以你返回了j-i = 9-6 = 3

这是正确的答案!