JavaScript Program to find Maximum Distance Between two Occurrences of Same Element in Array
Last Updated :
26 Aug, 2024
Given an array of repeated elements, the task is to find the maximum distance between two occurrences of an element.
Example:
Input : arr[] = {3, 2, 1, 2, 1, 4, 5, 8, 6, 7, 4, 2}
Output: 10
// maximum distance for 2 is 11-1 = 10
// maximum distance for 1 is 4-2 = 2
// maximum distance for 4 is 10-5 = 5 Brute Force
- Use a dictionary to store element indices.
- Initialize max distance as -1.
- Iterate through the array.
- Update max distance when encountering the same element.
- Return the maximum distance found.
Example: Below are implementations of the idea.
JavaScript
function maxDistance(arr) {
let dict = {};
let maxD = -1;
for (let i = 0; i < arr.length; i++) {
if (dict[arr[i]] !== undefined) {
maxD = Math.max(maxD, i - dict[arr[i]]);
} else {
dict[arr[i]] = i;
}
}
return maxD;
}
let arr = [1, 2, 4, 1, 3, 4, 2, 5, 6, 5];
console.log(
"Max distance between occurrences of same element: "
+ maxDistance(arr));
OutputMax distance between occurrences of same element: 5
Time Complexity: O(N^2)
Space Complexity: O(1)
Optimal Solution
- Use a
Map to store the first occurrence index of each element. - Iterates through the array, updating the maximum distance for repeated elements.
- Returns the maximum distance found between occurrences of the same element in the array.
Example: Below are implementations of the idea.
JavaScript
function maxDistance(arr, n) {
let map = new Map();
let maxDist = 0;
for (let i = 0; i < n; i++) {
if (!map.has(arr[i]))
map.set(arr[i], i);
else
maxDist = Math.max(maxDist, i - map.get(arr[i]));
}
return maxDist;
}
let arr = [1, 2, 4, 1, 3, 4, 2, 5, 6, 5];
console.log(
"Max distance between occurrences of same element: "
+ maxDistance(arr,10));
OutputMax distance between occurrences of same element: 5
Time Complexity: O(N) under the assumption that unordered_map’s search and insert operations take O(1) time.
Space Complexity: O(N)
Sorting and Two-Pointer Approach
In this method, we first store the indices of each element in a dictionary. Then, we sort the indices of each element and use a two-pointer approach to find the maximum distance for each element.
Example:
Input: arr = [3, 2, 1, 2, 1, 4, 5, 8, 6, 7, 4, 2]
Output: 10
Explanation:
- Maximum distance for
2 is 11 - 1 = 10 - Maximum distance for
1 is 4 - 2 = 2 - Maximum distance for
4 is 10 - 5 = 5
Example:
JavaScript
function maxDistance(arr) {
const elementIndices = {};
// Store indices of each element
for (let i = 0; i < arr.length; i++) {
if (elementIndices[arr[i]] === undefined) {
elementIndices[arr[i]] = [];
}
elementIndices[arr[i]].push(i);
}
let maxDist = -1;
// Iterate through each element in the dictionary
for (const key in elementIndices) {
const indices = elementIndices[key];
if (indices.length > 1) {
// Find the max distance using first and last index
const dist = indices[indices.length - 1] - indices[0];
maxDist = Math.max(maxDist, dist);
}
}
return maxDist;
}
// Examples
const arr1 = [3, 2, 1, 2, 1, 4, 5, 8, 6, 7, 4, 2];
console.log(maxDistance(arr1)); // Output: 10
const arr2 = [1, 1, 1, 1];
console.log(maxDistance(arr2)); // Output: 3
const arr3 = [1, 2, 3, 4, 5];
console.log(maxDistance(arr3)); // Output: -1 (no repeated elements)
Prefix Sum with Hash Map
Idea:
- Use a Hash Map to store the first occurrence index of each element.
- Compute Distances dynamically while iterating through the array.
- Update Maximum Distance if a larger distance is found.
Steps:
- Initialize a Hash Map: This map will store the first occurrence index of each element.
- Iterate Through the Array: For each element:
- If the element is not in the map, store its index as its first occurrence.
- If the element is already in the map, calculate the distance from its first occurrence to the current index.
- Update the maximum distance if the calculated distance is larger.
- Return the Maximum Distance.
Example:
JavaScript
function maxDistance(arr) {
let map = new Map();
let maxDist = -1;
for (let i = 0; i < arr.length; i++) {
if (!map.has(arr[i])) {
map.set(arr[i], i);
} else {
const firstIndex = map.get(arr[i]);
maxDist = Math.max(maxDist, i - firstIndex);
}
}
return maxDist;
}
const arr1 = [3, 2, 1, 2, 1, 4, 5, 8, 6, 7, 4, 2];
console.log(maxDistance(arr1));
const arr2 = [1, 1, 1, 1];
console.log(maxDistance(arr2));
const arr3 = [1, 2, 3, 4, 5];
console.log(maxDistance(arr3));
Explore
JavaScript Basics
Array & String
Function & Object
OOP
Asynchronous JavaScript
Exception Handling
DOM
Advanced Topics