Я новичок в переполнении стека. Надеюсь, этот вопрос встретит руководство. Thnakyou.!
class Solution:
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
start = self.firstGreaterEqual(nums, target)
if start==len(nums) or nums[start]!=target:
return [-1, -1]
return [start, self.firstGreaterEqual(nums, target+1)-1]
def firstGreaterEqual(self, nums, target):
lo, hi = 0, len(nums)
while lo<hi:
mid = (hi+lo)//2
if nums[mid]<target:
lo = mid + 1
else:
hi = mid
return lo
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Эта программа предназначена для поиска ссылки диапазона для программы. Это решение имеет лучшее время работы. Мне трудно понять логику этого. Он использует двоичный поиск, но я не совсем понимаю его.
Таким образом, он в основном работает над принципом двоичного поиска, как вы указали.
Здесь алгоритм разбивается простыми словами
Затем найдите первое появление target+1
, предположим, что возникновение сохраняется в end
переменной, тогда последнее появление исходной target
будет "end -1
Сначала вы обнаруживаете первое появление цели, которую вы ищете
Пример массива nums = [5,7,7,8,8,10], target = 8
lo = 0
, hi = len(nums)
, mid = (hi+lo)//2
mid = 3
start
значенияТеперь, когда мы получили первое событие, переходим к следующему этапу
Затем найдите первое обнаружение target+1
lo = 0
, hi = len(nums)
, mid = (hi+lo)//2
, target+1 = 9
mid = 3
target+1
, поэтому мы устанавливаем low = mid +1
mid = (hi+lo)//2
, что равно 5target+1
, поэтому мы устанавливаем hi = mid
while loop
так как условие while lo<hi
оценивается как Falselo
качестве конечного индексаТеперь мы начинаем = 3, а end = 5, поэтому возвращаем [start, end -1], т.е. [3,4]
Ссылка: