Q1
First solve this easier problem in O(n) : find i0 < j0 to maximize A[j0] - A[i0] .
For each j0 we need to find the minimum 0, 1, ..., j0 - 1 and compare A[j0] - this minimum with the global maximum. This is easy to do by simply calculating the minimum while we go.
Now for your original problem, we need i1 < j1 to maximize A[j1] - A[i1] . Or, for each i1 , we need to find j1 > i1 such that A[j1] - A[i1] maximized.
Let be:
min[i] = minimum in [0, ..., i] max[i] = maximum in [i, ..., n - 1]
So, now we need i < j such that A[i] - min[i - 1] + max[j + 1] - A[j] maximized. This can be done by computing in 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]}
Then just take max max1[i - 1] + max2[i] for all i >= 2 .
Ivlad source share