- Write a program to find maximum difference between elements such that larger element is after smaller element.
Given an integer array of size N, we have to maximum difference between a pair of element. Find a pair of element array[i] and array[j] such that array[j]-array[i] is maximum, array[j] > array[i] and j > i. For Example :
Input Array : 7, 3, 9, 1, 0, -4, 7, 2, 5, 6 Maximum Difference is 11 between -4 and 7
Brute Force : O(n2)
C program to find maximum difference between two elements
#include <stdio.h>
/* This function returns the maximum difference between
two elements of array, such that larger elements
is after smaller element*/
int getMaxDiff(int *array, int size) {
/* Initialize maxDiff with diference
of first two element */
int i, j;
int maxDiff = array[1] - array[0];
/* For every element, check it's difference
with all other larger elements */
for(i = 0; i < size; i++){
for(j = i+1; j < size; j++){
if((array[j] - array[i] > maxDiff) && (array[j] > array[i]))
maxDiff = array[j] - array[i];
}
}
return maxDiff;
}
int main(){
int array[10] = {7, 3, 9, 1, 0, -4, 7, 2, 5, 6};
int maxDiff = getMaxDiff(array, 10);
printf("Maximum Difference : %d", maxDiff);
return 0;
}
OutputMaximum Difference : 11
Optimized approach : O(n)
- Traverse inputArray from index 0 to N-1 and keep tract of the minimum element found till now(min) and maximum difference between any two element till now(maxDiff).
- Let current element is inputArray[i], difference between the current element and minimum element found till now is greater than maxDiff(array[i] - min > maxDiff) then update maxDiff.
- If array[i] is less than min, then update min.
C program to find maximum difference two elements in linear time
#include <stdio.h>
/* This function returns the maximum difference between
two elements of array, such that larger elements
is after smaller element */
int getMaxDiff(int *array, int size) {
int i, j, min, maxDiff;
/* Initialize maxDiff with diference
of first two element */
maxDiff = array[1] - array[0];
min = array[0];
/* For every element, check it's difference
with min is greater than maxDiff */
for(i = 0; i < size; i++){
if(array[i] - min > maxDiff){
maxDiff = array[i] - min;
}
/* Update min */
if(array[i] < min)
min = array[i];
}
return maxDiff;
}
int main(){
int array[10] = {7, 3, 9, 1, 0, 2, 7, 2, 5, 6};
int maxDiff = getMaxDiff(array, 10);
printf("Maximum Difference : %d", maxDiff);
return 0;
}
OutputMaximum Difference : 7
By finding difference between adjacent elements : O(n)
- Create a temporary array and populate the difference of adjacent elements of inputArray in tempArray.(tempArray[i] = inputArray [i+1] - inputArray [i])
- Find Maximum sum sub array of tempArray. Let the maximum sum subarray is from index x to y whose sum is SUM.
- Now, Maximum difference between two elements is SUM and corresponding elements are at index x and y.
#include <stdio.h>
int getMaxDiff(int *array, int size) {
/* Create a temporary array to store the
differences of adjacent elements */
int i, maxDiff, diffArray[size-1];
for(i = 0; i < size-1; i++) {
diffArray[i] = array[i+1] - array[i];
}
/* Find Maximum sum sub-array if difference Array */
maxDiff = diffArray[0];
for(i = 1; i < size-1; i++) {
if(diffArray[i-1] > 0)
diffArray[i] += diffArray[i-1];
if (maxDiff < diffArray[i])
maxDiff = diffArray[i];
}
return maxDiff;
}
int main(){
int array[10] = {7, 3, 9, 1, 0, 2, 7, 2, 5, 6};
int maxDiff = getMaxDiff(array, 10);
printf("Maximum Difference : %d", maxDiff);
return 0;
}
OutputMaximum Difference : 7