Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 平均值大于或等于k的最长连续子阵列_Algorithm_Array Algorithms - Fatal编程技术网

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

Algorithm 平均值大于或等于k的最长连续子阵列,algorithm,array-algorithms,Algorithm,Array Algorithms,考虑一个由N个整数组成的数组。查找最长的连续子阵列,使其元素的平均值大于(或等于)给定的数字k 显而易见的答案是O(n^2)复杂度。我们能做得更好吗?我们可以通过在O(n)时间内从所有值中减去k,将这个问题减少到sum>=0的最长连续子阵列。现在让我们计算前缀和: index 0 1 2 3 4 5 6 array 2 -3 3 2 0 -1 prefix 0 2 -

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


显而易见的答案是O(n^2)复杂度。我们能做得更好吗?

我们可以通过在O(n)时间内从所有值中减去k,将这个问题减少到sum>=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\u right-prefix\u 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 logn)。

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

以下是运行代码的详细信息:

可能会有一些小的角落案例,很容易处理。

朋友们,请告诉我您的想法。

在您的第一张桌子上,您有一个
5
前缀。这不应该是一个
4
(或者数组值应该是
3
):-你说得对,我在研究另一个数组是出于某种原因:修复了二进制搜索的目的是什么?仅仅在第三个表中找到
maxind-index
的最大值还不够吗?这应该也行。但是,由于排序的原因,运行时仍然是O(n log n)。@jma127您能解释一下为什么通过从所有值中减去k,它会减少为:子数组,总和>=0吗