Algorithm 平均值大于或等于k的最长连续子阵列
考虑一个由N个整数组成的数组。查找最长的连续子阵列,使其元素的平均值大于(或等于)给定的数字kAlgorithm 平均值大于或等于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 -
显而易见的答案是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吗