Maximum difference between first and last indexes of an element in array
Given an array of n integers. The task is to find the difference of first and last index of each distinct element so as to maximize the difference.
Examples:
Input : {2, 1, 3, 4, 2, 1, 5, 1, 7}
Output : 6
Element 1 has its first index = 1
and last index = 7
Difference = 7 - 1 = 6
Other elements have a smaller first and last
index difference
Input : {2, 2, 1, 1, 8, 8, 3, 5, 3}
Output : 2
Maximum difference is for indexes of element 3.
A simple approach is to run two loops and find the difference for each element and accordingly update the max_diff. It has a time complexity of O(n2) and the approach also needs to keep track of the elements that have been visited so that difference for them is not calculated unnecessarily.
An efficient approach uses hashing. It has the following steps.
- Traverse the input array from left to right.
- For each distinct element map its first and last index in the hash table.
- Traverse the hash table and calculate the first and last index difference for each element.
- Accordingly update the max_diff.
In the following implementation unordered_map has been used for hashing as the range of integers is not known.
C++
#include <bits/stdc++.h>
using namespace std;
int maxDifference( int arr[], int n)
{
struct index
{
int f, l;
};
unordered_map< int , index> um;
for ( int i=0; i<n; i++)
{
if (um.find(arr[i]) == um.end())
um[arr[i]].f = i;
um[arr[i]].l = i;
}
int diff, max_diff = INT_MIN;
unordered_map< int , index>::iterator itr;
for (itr=um.begin(); itr != um.end(); itr++)
{
diff = (itr->second).l - (itr->second).f;
if (max_diff < diff)
max_diff = diff;
}
return max_diff;
}
int main()
{
int arr[] = {2, 1, 3, 4, 2, 1, 5, 1, 7};
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Maximum Difference = "
<<maxDifference(arr, n);
return 0;
}
|
Java
import java.util.HashMap;
import java.util.Map;
public class MaxDiffIndexHashing {
static class Element {
int first;
int second;
public Element() {
super ();
}
public Element( int first, int second) {
super ();
this .first = first;
this .second = second;
}
}
public static void main(String[] args) {
int arr[]={ 2 , 1 , 3 , 4 , 2 , 1 , 5 , 1 , 7 };
System.out.println( "Maximum Difference= " + maxDiffIndices(arr));
}
private static int maxDiffIndices( int [] arr) {
int n = arr.length;
int maxDiffIndex = 0 ;
Map<Integer, Element> map = new HashMap<Integer, Element>();
for ( int i = 0 ; i < n; i++) {
if (map.containsKey(arr[i])) {
Element e = map.get(arr[i]);
e.second = i;
} else {
Element e = new Element();
e.first = i;
map.put(arr[i], e);
}
}
for (Map.Entry<Integer, Element> entry : map.entrySet()) {
Element e = entry.getValue();
if ((e.second - e.first) > maxDiffIndex)
maxDiffIndex = e.second - e.first;
}
return maxDiffIndex;
}
}
|
Python3
import sys
def maxDifference(arr, n):
class index:
def __init__( self ,f,l):
self .f = f
self .l = l
um = {}
for i in range (n):
if (arr[i] in um):
e = um[arr[i]]
e.l = i
else :
e = index(i,i)
um[arr[i]] = e
diff = - sys.maxsize - 1
max_diff = - sys.maxsize - 1
for key,value in um.items():
diff = value.l - value.f
if (max_diff < diff):
max_diff = diff
return max_diff
arr = [ 2 , 1 , 3 , 4 , 2 , 1 , 5 , 1 , 7 ]
n = len (arr)
print (f "Maximum Difference = {maxDifference(arr, n)}" )
|
C#
using System;
using System.Collections.Generic;
public class MaxDiffIndexHashing
{
class Element {
public int first;
public int second;
public Element() {
}
public Element( int first, int second) {
this .first = first;
this .second = second;
}
}
public static void Main(String[] args) {
int []arr={2, 1, 3, 4, 2, 1, 5, 1, 7};
Console.WriteLine( "Maximum Difference= " + maxDiffIndices(arr));
}
private static int maxDiffIndices( int [] arr) {
int n = arr.Length;
int maxDiffIndex = 0;
Dictionary< int , Element> map = new Dictionary< int , Element>();
for ( int i = 0; i < n; i++) {
if (map.ContainsKey(arr[i])) {
Element e = map[arr[i]];
e.second = i;
} else {
Element e = new Element();
e.first = i;
map.Add(arr[i], e);
}
}
foreach (KeyValuePair< int , Element> entry in map) {
Element e = entry.Value;
if ((e.second - e.first) > maxDiffIndex)
maxDiffIndex = e.second - e.first;
}
return maxDiffIndex;
}
}
|
Javascript
<script>
function maxDifference(arr, n)
{
class index
{
constructor(f,l){
this .f = f;
this .l = l;
}
};
let um = new Map();
for (let i=0; i<n; i++)
{
if (um.has(arr[i]) == true ){
let e = um.get(arr[i]);
e.l = i;
}
else {
let e = new index();
e.f = i;
um.set(arr[i], e);
}
}
let diff, max_diff = Number.MIN_VALUE;
for (let [key,value] of um)
{
diff = value.l - value.f;
if (max_diff < diff)
max_diff = diff;
}
return max_diff;
}
let arr = [2, 1, 3, 4, 2, 1, 5, 1, 7];
let n = arr.length;
document.write( "Maximum Difference = " +maxDifference(arr, n), "</br>" );
</script>
|
Output
Maximum Difference = 6
Time Complexity: O(n)
Last Updated :
12 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...