В мире программирования эффективные алгоритмы поиска подобны картам сокровищ, которые быстро и эффективно приводят нас к желаемым результатам. Одной из таких задач является задача «1095. Найти в горном массиве». В этой статье блога мы рассмотрим различные методы решения этой проблемы, используя разговорный язык и практические примеры кода. Так что пристегнитесь и приготовьтесь покорять горы программирования!
Метод 1: линейный поиск
Давайте начнем с простого и понятного подхода: линейного поиска. Мы обойдём весь горный массив, сравнивая каждый элемент с целевым значением, пока не найдём совпадение.
def findInMountainArray(target, mountain_arr):
for i in range(mountain_arr.length()):
if mountain_arr.get(i) == target:
return i
return -1
Метод 2: двоичный поиск
Далее давайте активизируем нашу игру и окунемся в мир двоичного поиска. Используя тот факт, что горный массив сортируется в порядке возрастания до определенной точки, а затем по убыванию, мы можем эффективно сузить диапазон поиска.
def findInMountainArray(target, mountain_arr):
peak = findPeak(mountain_arr)
index = binarySearch(mountain_arr, target, 0, peak)
if index == -1:
index = binarySearch(mountain_arr, target, peak + 1, mountain_arr.length() - 1, reverse=True)
return index
def binarySearch(arr, target, left, right, reverse=False):
while left <= right:
mid = (left + right) // 2
mid_val = arr.get(mid)
if mid_val == target:
return mid
elif (mid_val < target and not reverse) or (mid_val > target and reverse):
left = mid + 1
else:
right = mid - 1
return -1
def findPeak(mountain_arr):
left, right = 0, mountain_arr.length() - 1
while left < right:
mid = (left + right) // 2
if mountain_arr.get(mid) < mountain_arr.get(mid + 1):
left = mid + 1
else:
right = mid
return left
Метод 3: разделяй и властвуй
Для любителей приключений, ищущих альтернативные пути, давайте рассмотрим стратегию «разделяй и властвуй». Разобьем задачу на более мелкие подзадачи и проведём рекурсивный поиск в восходящих и нисходящих участках горного массива.
def findInMountainArray(target, mountain_arr):
peak = findPeak(mountain_arr)
index = binarySearch(mountain_arr, target, 0, peak)
if index == -1:
index = reverseBinarySearch(mountain_arr, target, peak + 1, mountain_arr.length() - 1)
return index
def binarySearch(arr, target, left, right):
while left <= right:
mid = (left + right) // 2
mid_val = arr.get(mid)
if mid_val == target:
return mid
elif mid_val < target:
left = mid + 1
else:
right = mid - 1
return -1
def reverseBinarySearch(arr, target, left, right):
while left <= right:
mid = (left + right) // 2
mid_val = arr.get(mid)
if mid_val == target:
return mid
elif mid_val > target:
left = mid + 1
else:
right = mid - 1
return -1
def findPeak(mountain_arr):
left, right = 0, mountain_arr.length() - 1
while left < right:
mid = (left + right) // 2
if mountain_arr.get(mid) < mountain_arr.get(mid + 1):
left = mid + 1
else:
right = mid
return left
В этой статье блога мы рассмотрели несколько методов решения проблемы «1095. Найти в горном массиве». Мы начали с простого линейного поиска, затем перешли к двоичному поиску и подходам «разделяй и властвуй». Каждый метод имеет свои преимущества и особенности, зависящие от размера и характеристик входных данных. Поняв эти методы, вы будете хорошо подготовлены к решению подобных задач в будущем.
Отправляясь в свои приключения в области программирования, не забудьте выбрать правильный путь в зависимости от местности, с которой вы столкнетесь. Приятного кодирования!