Бинарный поиск уменьшает интервал вдвое после каждого сравнения. Итеративная реализация даёт O(log n) времени и O(1) дополнительной памяти.
Поиск целевого элемента в упорядоченном массиве
Бинарный поиск уменьшает интервал вдвое после каждого сравнения. Итеративная реализация даёт O(log n) времени и O(1) дополнительной памяти.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию, получающую на вход упорядоченный массив целых чисел и значение, которое нужно найти. Если элемент присутствует в массиве, функция должна вернуть его позицию (индекс). Если элемент отсутствует, вернуть -1. Требуется обеспечить максимально возможную эффективность решения.
public class Live {
public static void main(String[] args) {
// пример использования
}
public static int search(int[] nums, int target) {
// реализация
}
}
Ответ
Бинарный поиск уменьшает интервал вдвое после каждого сравнения. Итеративная реализация даёт O(log n) времени и O(1) дополнительной памяти.
public static int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
Требуется ненулевой массив, отсортированный по возрастанию. Пустой массив возвращает -1. При одинаковых значениях возвращается любое найденное вхождение, не обязательно первое. Формула mid избегает переполнения сложения left + right.