【问题标题】:Algorithm for the maximum absolute sub array sum under threshold value阈值下最大绝对子数组和的算法
【发布时间】:2017-08-22 12:33:00
【问题描述】:

我想用标题表达的是以下练习: 给定一个正数和负数的列表,其中 0

例如: 名单:1 -4 5 6 -3 -2 14

如果阈值为 4,则最佳解决方案是{-4}

如果阈值为 9,则最佳解决方案是{-3 -2 14}

如果阈值为 100,则最佳解决方案是 {5 6 -3 -2 14}

如果阈值为 7,则最佳解决方案是 {-4 5 6}

如果阈值为 2,则最佳解决方案是 {-2}

对于那些对我如何解决问题感兴趣的人:

我使用的 O(n^2) 解决方案只是遍历了每个可能的子数组总和。它并没有重新计算每个总和,而只是添加一个遇到的新数字。

【问题讨论】:

  • 你的问题可能必须通过递归方式解决。
  • 但递归解决方案通常不是最快的。我感觉有一些技巧或数据结构可以在这种情况下提供帮助。到目前为止,我还没有找到这样的技巧或结构。
  • 你应该提供你的结构的一部分,以帮助可以回答的人可视化你的问题。
  • 你的意思是代码变慢了?还是实际需要的示例?
  • "如果阈值为 4,最好的解决方案是{-4}"和"如果阈值是 2,最好的解决方案是{-2}",为什么?在这两种情况下不应该是{1}吗?

标签: arrays algorithm performance


【解决方案1】:

计算部分和:P(i) = sum(a[0]...a[i])

对于给定的位置对 x, y (x P(y) - P(x-1)。 因此,如果我们修复 y,那么您正在寻找大于或等于 y 的最小值 - 目标。

因此迭代集合并将项目插入平衡树(如大多数语言中的集合)。然后您可以在集合中查找值并返回该值(在 C++ 中,upper_bound 几乎完全符合您的需要)。继续这样做,找到满足条件的最大组合。

查找和插入应该是 O(log N),所以总体上解决方案将是 O(N logN)。

【讨论】:

  • 我想补充一点,必须检查两个选项,因为答案是总和的绝对值。 |(P(y) - P(x-1)| <= target P(y) - P(x-1) <= target v P(y) - P(x-1) >= -target P(x-1) <= P(y) - target v P(x-1) >= P(y) + target 希望这是可以理解的。
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多