创建新的 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
量子点