当前位置: 首页 > 知识库问答 >
问题:

平均大于或等于k的最长连续子线

郎宏逸
2023-03-14

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

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

共有2个答案

施彬彬
2023-03-14

我们可以在O(n)时间和O(n)空间复杂度下解决问题:
我已经尝试了朴素和最优的方法
简而言之,这个问题涉及两个步骤:
(1)从每个ar[i]中减去k,并在新数组中找到累加值。让我们将新数组称为CumArr[]。
(2)现在问题变成了在CumArr[]中找到max(j-1)使得j

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

可能会有一些小的角落案件可以很容易地处理。
朋友们,让我知道你的想法。

锺离明煦
2023-03-14

我们可以将这个问题简化为最长的连续子数组,总和

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找到相距最远的两个索引

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

现在,让我们回到原来的前缀数组。对于每个前缀-索引对,我们在新的数组上做一个二分搜索法来找到最小的前缀

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

 类似资料:
  • 我想找到给定正整数数组中元素的最大数目,使得它们的和小于或等于给定的k。例如,我有一个数组 答案是3,因为1,2,3是求和6的最大元素。

  • 如何加快以下问题陈述的执行速度?我有一个正确的解决方案,通过每一个测试的小输入。但是,它超过了较大输入的时间限制。我当前的实现是数组大小的二次型。 你的答案应该是基于1的,这意味着数组的第一个位置是1而不是0。 实施

  • 我知道一个O(n2)soln,它能以更好的方式实现吗,因为数组中元素的数量限制非常大

  • 今天我注意到这个node.js代码: 给出输出 这很奇怪;如果某物不等于0或大于0,那么它为什么大于或等于0呢?发生什么事了?

  • 本文向大家介绍LCM的最大长度子数组等于C ++中的乘积,包括了LCM的最大长度子数组等于C ++中的乘积的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到子数组的最大长度,它的LCM与该子数组元素的乘积相同。如果找不到这种子数组,则返回-1。假设数组为{6,10,21},则长度为2,因为在那里有子数组{10,21},其LCM为210,乘积也为210。 该方法是直接的。我

  • 问题内容: 我在PostgreSQL中有一个名为的关系,该关系包含2个字段:和,我想找到具有最高值的产品。据我所知,有两种方法可以做到: 或者 他们的执行速度有什么不同吗? 问题答案: 如果有任何行,第一个查询将失败(如Gordon所示)。 仅当所有行都具有时,第二个查询才会失败。因此,它在大多数情况下应该是可用的。(而且速度更快。) 如果在 Postgres 12或更早版本中 需要NULL安全查