输入:n个正数和负数以及数字k的数组。
输出:至少k个连续元素的子数组,最大元素总和除以子数组中元素的数量。
O(n ^ 2)算法很简单。有人有更好的算法吗?
答案 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]
。