Find duplicate integer in time O(n logn) and space O(n)
Here’s how you can find a duplicate integer in a list of integers (read array) in space O(n) and time O(nlogn). This will only return the first duplicate integer in the array.
Note: This only applies for a list of integers 1..n. This won’t work otherwise.
function findDuplicate(arr) {
var floor = 1;
var ceiling = arr.length - 1;
while (floor < ceiling) {
var midpoint = Math.floor(floor + (ceiling - floor) / 2);
var lowerRangeFloor = floor;
var lowerRangeCeiling = midpoint;
var upperRangeFloor = midpoint + 1;
var upperRangeCeiling = ceiling;
var distinctPossibleIntegersInLowerRange =
lowerRangeCeiling - lowerRangeFloor + 1;
var itemsInLowerRange = 0;
arr.forEach(function (item) {
if (item >= lowerRangeFloor && item <= lowerRangeCeiling) {
itemsInLowerRange += 1;
}
});
if (itemsInLowerRange > distinctPossibleIntegersInLowerRange) {
floor = lowerRangeFloor;
ceiling = lowerRangeCeiling;
} else {
floor = upperRangeFloor;
ceiling = upperRangeCeiling;
}
}
return floor;
}
// Example use case
let arr = [1, 2, 3, 4, 5, 4, 6, 3, 4, 6];
console.log(findDuplicate(arr)); // 3