该程序如何工作? FirstGreaterEqual方法如何工作

时间:2018-06-23 15:35:49

标签: python search binary-search

我是堆栈溢出的新手。我希望这个问题符合指导方针。 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]

该程序用于搜索范围 link to the program 该解决方案具有最佳的运行时间。 我发现很难理解其背后的逻辑。 它正在使用二进制搜索,但我还没有完全理解它。

1 个答案:

答案 0 :(得分:1)

因此,正如您所指出的,它基本上是在二进制搜索的原理上工作。

这是简单明了的算法

  • 首先,您找到要寻找的目标的第一次出现
    • 如果没有目标发生,则返回[-1,-1]
  • 然后找到target+1的第一个出现位置,假设该出现位置存储在变量end中,那么原始target的最后一个出现位置将是`end -1 < / p>

    首先,您发现所寻找目标的首次出现
    示例数组nums = [5,7,7,8,8,10], target = 8

  • lo = 0hi = len(nums)mid = (hi+lo)//2

  • 现在您在数组mid = 3
  • 的中间搜索
  • 在nums [3]处的元素为8,与taget相同
  • 这是起始索引,将其返回并存储在值start

现在,因为我们是第一次出现,所以我们进入了下一个阶段

然后找到target+1

的第一个匹配项
  1. lo = 0hi = len(nums)mid = (hi+lo)//2target+1 = 9
  2. 现在您在数组mid = 3
  3. 的中间搜索
  4. nums [3]处的元素为8,小于target+1,因此我们将low = mid +1设置为
  5. 接下来,我们将mid = (hi+lo)//2设置为5
  6. nums [5]处的元素为10,大于target+1,因此我们将hi = mid设置为
  7. 在上一步之后,由于条件while loop的计算结果为False,我们退出了while lo<hi
  8. 返回lo作为结束索引

现在我们有start = 3,end = 5,所以我们返回[start,end-1],即[3,4]

参考: