查找具有最大元素数/元素数的子数组

时间:2012-10-26 19:59:52

标签: algorithm matrix

输入:n个正数和负数以及数字k的数组。

输出:至少k个连续元素的子数组,最大元素总和除以子数组中元素的数量。

O(n ^ 2)算法很简单。有人有更好的算法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用二进制搜索。

对于搜索值x,请考虑数组b[i] = a[i] - x。现在找到最小长度子阵列的长度至少为k

这是有效的,因为长度为k的子阵列的平均值为(a[p] + ... + a[p + k - 1]) / k。所以我们有:

(a[p] + ... + a[p + k - 1]) / k >= avg
a[p] + ... + a[p + k - 1] >= avg * k
(a[p] - avg) + ... + (a[p + k - 1] - avg) >= 0

所以,如果你二元搜索平均值,通过从每个元素中减去它,如果你能找到长度至少为k的正和子阵列(找到最大值并检查它是否为正),然后avg是一个有效的答案:继续搜索[avg, max_avg],看看你是否能找到更好的答案。如果不是,请将搜索范围缩小为[0, avg]