【问题标题】:Maximum (a[j] - a[i]) * min(b[j], b[i]) such that j > i?最大值 (a[j] - a[i]) * min(b[j], b[i]) 使得 j > i?
【发布时间】:2021-04-09 14:07:42
【问题描述】:

给定两个数组ab 等长n 具有正整数值,我想要一个算法来找到(a[j] - a[i]) * min(b[j], b[i]) 的最大数量使得0 <= i < j < n。这个问题与Maximum difference between two elements such that larger element appears after the smaller number 有点相关,但它也引入了数组b 的新限制。由于min() 限制,此算法不能通过创建新数组c 来使用,因此对于每个ic[i] = a[i] * b[i]。 所以我想知道这个问题是否可以在线性O(n)O(n*logn) 中解决,或者可以证明只能在O(n^2) 中解决。任何提示都会很棒。

【问题讨论】:

  • 你能链接到你发现这个问题的地方吗?
  • @IVlad 我没在某处找到它。它来自一个优化股票市场交易的问题,其中a 数组代表股票的价格,b 数组代表当天可以买卖多少股票的限制i 和@987654338 @分别。
  • 能否请您也发布完整的原始问题?可能有一个不涉及这个公式的更简单的解决方案。

标签: arrays algorithm optimization dynamic-programming


【解决方案1】:

对于固定的ji < j 有两种情况:

1. b[i] < b[j]

我们必须找到最小的a[i] 使得这个条件成立。

我们可以为此使用deque 数据结构d1,其中a[d1.front] 将始终是这个最小值 - 所以我们保持d1 排序使得条件成立并且它包含a 中的最小值.请注意,d1 仅包含位置,而不包含值。

对于每个j(您可能需要对d1 在您选择的语言中是否为空进行一些完整性检查):

while a[j] <= a[d1.back]:
    d.pop_back()
while b[d1.front] >= b[j]:
    d.pop_front()
quantity1 = (a[j] - a[d1.front]) * b[d1.front]
d1.push_back(j)

2。 b[i] &gt;= b[j]

d2 做同样的事情来计算quantity2。然后,取两个数量的最大值,并将这个最大值与全局最大值进行比较。

这可能看起来像 O(n^2),因为您仍然会有嵌套循环,但它是 O(n):请注意每个值将最多进入和离开每个双端队列一次。

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2012-10-20
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多