创建新的 2 个数组:
max[i] = max { arr[0], arr[1], ..., arr[i] }
min[i] = min { arr[n-1], arr[n-2], ..., arr[i] }
(max is the maximum from first to i, min is the minimum from i to last)
现在,迭代辅助数组并找到最大差异max[i] - min[i]
这需要 3 次迭代,因此是O(n)
.
正确性证明(指南):
让最大的下降是从 indexi
到 index j
,其中i<j
:
- 然后,
max[i] >= arr[j]
(因为我们已经通过了),并且
min[i] <= arr[i]
- 因此max[j] - min[j] >= arr[i] - arr[j]
,算法提供的答案至少与最优答案一样好。
- 此外,由于最大的下降是
i,j
,所以不可能有k<j
这样的arr[k] < arr[i]
,因为最大的下降将是从arr[k]
到arr[j]
。相似——不可能有k>j
这样的
arr[k] < arr[j]
,出于同样的原因——因此max[j]-min[j] <=
arr[i] - arr[j]
从上面我们可以得出结论max[j]-min[j] = arr[i] - arr[j]
。剩下的一个正式的完整证明就是证明对于每一个k
你得到max[k]-min[k] <= max[j] - min[j]
,确实是这样,否则有一些u<k
,v>k
这样max[k]=arr[u], min[k]=arr[v]
,你得到那个,这与最大下降arr[u] - arr[v] > arr[i] - arr[j]
的事实相矛盾。i,j
量子点