Как работает эта программа? Как работает метод firstGreaterEqual

1

Я новичок в переполнении стека. Надеюсь, этот вопрос встретит руководство. 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]

Эта программа предназначена для поиска ссылки диапазона для программы. Это решение имеет лучшее время работы. Мне трудно понять логику этого. Он использует двоичный поиск, но я не совсем понимаю его.

Теги:
search
binary-search

1 ответ

1
Лучший ответ

Таким образом, он в основном работает над принципом двоичного поиска, как вы указали.

Здесь алгоритм разбивается простыми словами

  • Сначала вы обнаруживаете первое появление цели, которую ищете
    • Если нет цели мишени, верните [-1, -1]
  • Затем найдите первое появление 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
  • Элемент в nums [3] равен 8, что совпадает с такетом
  • Это начальный индекс, верните его и сохраните в start значения

Теперь, когда мы получили первое событие, переходим к следующему этапу

Затем найдите первое обнаружение target+1

  1. lo = 0, hi = len(nums), mid = (hi+lo)//2, target+1 = 9
  2. Теперь вы просматриваете середину массива, здесь mid = 3
  3. Элемент в nums [3] равен 8, что меньше target+1, поэтому мы устанавливаем low = mid +1
  4. Затем мы устанавливаем mid = (hi+lo)//2, что равно 5
  5. Элемент в nums [5] равен 10, что больше, чем target+1, поэтому мы устанавливаем hi = mid
  6. После предыдущего шага мы выходим из while loop так как условие while lo<hi оценивается как False
  7. REturn lo качестве конечного индекса

Теперь мы начинаем = 3, а end = 5, поэтому возвращаем [start, end -1], т.е. [3,4]

Ссылка:

Ещё вопросы

Сообщество Overcoder
Наверх
Меню