Given an array A[], find (i, j) such that A[i] < A[j] and (j - i) is maximum.
--------------------------------------------------------------
A Typical two-direction search...
MaxDiff(vector<int> arr){
if(arr.size()==0) return 0;
int n=arr.size(),i,j;
vector<int> Lmin(n,0);
vector<int> Rmax(n,0);
Lmin[0]=arr[0];
for(i=1;i<n;i++)
Lmin[i]=min(arr[i],Lmin[i-1]);
Rmax[n-1]=arr[n-1];
for(i=n-2;i>=0;i--)
Rmax[i]=max(arr[i],Rmax[i+1]);
int maxdiff=0;
i=0,j=0;
while(i<n&&j<n){
if(Lmin[i]<Rmax[j]){
maxdiff=max(maxdiff,j-i);
j++;
}
else i++;
}
return maxdiff;
}
O(n) time and O(n) space solution. Tested! The key observation is the two auxiliary arrays LMin and RMax which saves the smallest value left of i and biggest value right of i