考虑一个N个整数的数组。找到最长的连续子阵列,使其元素的平均值大于(或等于)给定的数字k。
明显的答案是O(n ^ 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
可能会有一些小角落的情况可以轻松处理 让我知道你的想法朋友。