【问题标题】:Finding subarray with maximum sum/number of elements查找具有最大总和/元素数的子数组
【发布时间】:2012-10-26 19:59:51
【问题描述】:

输入:n 个正负数和一个数 k 组成的数组。

输出:至少有 k 个连续元素的子数组,其中元素的最大总和除以子数组中的元素数。

O(n^2) 算法很简单。有没有人对此有更好的算法?

【问题讨论】:

  • 这看起来更像是一个最高平均子数组问题。非常相似。
  • 子数组必须是连续的还是要寻找子集?
  • 这个问题有一个简单的答案:只要找到数组的最大元素。包含该元素的单元素子数组是最大和/大小子数组。
  • @EvgenyKluev 不正确。您是否忘记了“负”值?
  • @Wug 你有“最高平均子数组”问题的链接吗?

标签: algorithm matrix


【解决方案1】:

您可以使用二进制搜索。

对于搜索值x,请考虑数组b[i] = a[i] - x。现在找到长度至少为k的最大和子数组。

这是因为长度为k 的子数组的平均值是(a[p] + ... + a[p + k - 1]) / k。所以我们有:

(a[p] + ... + a[p + k - 1]) / k >= avg
a[p] + ... + a[p + k - 1] >= avg * k
(a[p] - avg) + ... + (a[p + k - 1] - avg) >= 0

所以,如果你对平均值进行二进制搜索,通过从每个元素中减去它,如果你能找到一个长度至少为k 的正和子数组(找到最大的子数组并检查它是否为正数),那么@ 987654328@ 是一个有效的答案:继续在[avg, max_avg] 中搜索,看看是否能找到更好的答案。如果没有,请将搜索减少到[0, avg]

【讨论】:

  • 有道理。运行时顺序变为 O(N)*log(数字范围)。我还不清楚何时停止二分搜索。
  • @MohammadMoghimi - 当您搜索的间隔变得足够小以满足您的目的时,您可以停止它。例如,当它变得小于10^-3 时尝试停止它。如果不够好,请减小指数。
猜你喜欢
  • 2017-01-17
  • 2015-07-27
  • 2023-01-25
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2017-08-22
  • 2013-12-15
  • 2019-02-24
相关资源
最近更新 更多