编程要素6.4双射和k射击策略算法

时间:2013-09-11 18:47:38

标签: algorithm

发现很难理解两个镜头和k-shot策略算法。这是一个问题:

Q1)arr是一个长度为n的数组。计算A [j0] -A [i0] + A [j1] -A [i1]的最大值,条件是:     i0< j0< i1< J1

Ans)我们可以在O(n)中进行单次(即最大利润买卖股票)。我们可以应用相同的技术      从j..n中找到最大值0 .. j和max。这将是O(n2)解决方案。

 Elements of Programming interviews book suggests a way of doing this in O(n) time by:
 doing a forward iteration and storing solution for A[0:j] such that 1<=j<=n-1  and then a backward iteration for A[j:n-1] such that 0<=j<=n-2 and then combining the two results.  Does anyone have any idea how this can be done?

Q2)你怎么做k-shot?

谢谢!

1 个答案:

答案 0 :(得分:3)

<强> Q1

让我们首先在O(n)中解决这个更简单的问题:找i0 < j0以使A[j0] - A[i0]最大化。

对于每个j0,我们需要找到0, 1, ..., j0 - 1的最小值,并将A[j0] - this minimum与全局最大值进行比较。到目前为止,只需计算最小值即可轻松完成。

现在,对于您的原始问题,我们还需要i1 < j1,以使A[j1] - A[i1]最大化。或者,对于每个i1,我们需要找到j1 > i1以使A[j1] - A[i1]最大化。

让:

min[i] = minimum in [0, ..., i]
max[i] = maximum in [i, ..., n - 1]

现在我们需要i < j以使A[i] - min[i - 1] + max[j + 1] - A[j]最大化。这可以通过计算O(n)

来完成
max1[i] = max{A[1] - min[0], A[2] - min[1], ..., A[i] - min[i - 1]}
max2[i] = max{max[i + 1] - A[i], max[i] - A[i - 1], ...max[1] - A[0]}

然后在所有max1[i - 1] + max2[i]上取i >= 2的最大值。