最长的连续子阵列,平均值大于或等于k

时间:2012-11-20 15:51:55

标签: algorithm array-algorithms

考虑一个N个整数的数组。找到最长的连续子阵列,使其元素的平均值大于(或等于)给定的数字k。

明显的答案是O(n ^ 2)复杂度。我们可以做得更好吗?

2 个答案:

答案 0 :(得分:6)

通过从O(n)时间中的所有值中减去k,我们可以将这个问题减少到总和> = 0的最长连续子阵列。现在让我们计算前缀总和:

index    0     1     2     3     4     5     6
array          2     -3    3     2     0     -1
prefix   0     2     -1    2     5     5     4

现在这个问题是找到与prefix_right - prefix_left >= 0最远的两个指数。让我们创建一个新的前缀索引数组,并按前缀排序,然后是索引。

index    2     0     1     3     6     4     5
prefix   -1    0     2     2     4     5     5

然后,我们可以进行从右向左扫描,为每个前缀计算前缀大于或等于当前前缀的最大索引:

index    2     0     1     3     6     4     5
prefix   -1    0     2     2     4     5     5
maxind   6     6     6     6     6     5     5

现在,让我们回到原始前缀数组。对于每个前缀索引对,我们在新阵列上进行二分查找以找到最小前缀> =当前前缀。我们从二进制搜索前缀的maxind中减去当前前缀的索引,以从当前索引开始检索最佳可能的序列长度。采用最大长度的序列。

由于排序和n个二进制搜索,该算法为O(n log n)。

答案 1 :(得分:0)

我们可以解决O(n)时间和O(n)空间复杂度的问题:
我尝试过天真而优化的方法 简而言之,问题涉及两个步骤:
(1)从每个ar [i]中减去k,并在新数组中找到累积值。让我们将新数组称为cumArr []。
(2)现在问题变成在CumArr []中找到max(j-1),使得j> i和cumArr [j]> cumArr [i]。这一步是一个着名的问题,可以在很多地方找到。

以下是运行代码的详细信息: http://codeshare.io/Y1Xc8

可能会有一些小角落的情况可以轻松处理 让我知道你的想法朋友。