Есть отсортированный массив, необходимо вернуть первый и последний индексы указанного числа.
Решение за O(n):
const a = [1, 2, 3, 4, 5, 5, 5, 5, 7, 9, 9, 9, 9];
const search = (array, n) => {
const a = array.reduce((accumulator, currentValue, idx) => {
if (currentValue === n) {
accumulator.push(idx);
}
return accumulator;
}, []);
if (!a.length) {
return [];
}
return [
a[0],
a[a.length - 1]
];
}
console.log(search(a, 5)); // [4, 7]
console.log(search(a, 2)); // [1, 1]
console.log(search(a, 8)); // []
Пытаюсь решить, используя бинарный поиск (O (log n) Логарифмическая сложность), но не выходит:
const a = [1, 2, 3, 4, 5, 5, 5, 5, 7, 9, 9, 9, 9];
const binarySearch = (array, n) => {
let output = [];
let left = 0
let right = array.length - 1
let middle = null
while (left <= right) {
middle = Math.floor((left + right) / 2);
if (n === array[middle]) {
output.push(middle);
return output;
} else if (n > array[middle]) {
left = middle;
} else {
right = middle;
}
}
return output;
}
console.log(binarySearch(a, 5)); // [4, 7]
console.log(binarySearch(a, 2)); // [1, 1]
console.log(binarySearch(a, 8)); // []