【问题标题】:How does this program work? How's firstGreaterEqual method working这个程序是如何工作的? firstGreaterEqual 方法如何工作
【发布时间】:2018-06-23 23:55:19
【问题描述】:

我是堆栈溢出的新手。我希望这个问题符合指导方针。 谢谢!

     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 此解决方案具有最佳运行时间。 我发现很难理解其背后的逻辑。 它正在使用二进制搜索,但我没有完全理解它。

【问题讨论】:

    标签: python search binary-search


    【解决方案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,与taget相同
    • 这是起始索引,返回它并存储在值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&lt;hi 的计算结果为 False
    7. 返回lo作为结束索引

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

    参考:

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多