二进制搜索中的元素邻居

时间:2019-04-11 02:56:27

标签: python

我读了两个leetcodes二进制搜索模板 Explore - LeetCode

标准模板I

def binarySearch(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    if len(nums) == 0:
        return -1

    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1

    # End Condition: left > right
    return -1
  

总结关键属性:

     
      
  1. 二进制搜索的大多数基本形式和基本形式
  2.   
  3. 无需确定元素的邻居即可确定搜索条件(或使用周围的特定元素)

  4.   
  5. 不需要后处理,因为在每个步骤中,您都在检查是否已找到该元素。如果到达末尾,则说明找不到该元素

  6.   

参考属性2:

  

无需与元素的邻居进行比较即可确定搜索条件(或使用周围的特定元素)

我不明白它的想法。

存在条件while left <= right,如何声明without comparing to the elements neighbors

模板II

def binarySearch(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    if len(nums) == 0:
        return -1

    left, right = 0, len(nums)
    while left < right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid

    # Post-processing:
    # End Condition: left == right
    if left != len(nums) and nums[left] == target:
        return left
    return -1

  

关键属性:

     
     
      
  • 一种实现二进制搜索的高级方法。
  •   
  • 搜索条件需要访问元素的直接右邻居
  •   
  • 使用元素的右邻居确定是否满足条件并决定向左还是向右走
  •   
  • 保证人搜索空间的每一步至少为2个
  •   
  • 需要后处理。剩下1个元素时,循环/递归结束。需要评估其余元素是否满足条件。
  •   

element是什么,不是中间吗?

我可能会陷入困境,能否请您提供一些帮助的提示?

1 个答案:

答案 0 :(得分:2)

我同意@ knh190,这里的描述非常不清楚,我已经阅读了很多次以了解他的想法。专注于代码更有用。

您可以以自己的方式理解代码,而不遵循他的规则。

另一个建议是,一种算法的实现太多,因此,只要选择最熟悉的版本,就会被太多的变化版本所迷惑,也许只是一些编码霍比特人。或者,它确实是最好的性能和最简洁的解决方案,但它不适合您。

对于第一个问题“存在条件while left <= right,如何陈述without comparing to the elements neighbors”:
我认为他的说法在这里含糊不清,我想你已经知道他的主意了,因为while left <= right,所以我们不需要without comparing to the elements neighbors
相比之下,您可以看到第二个版本while left < right,因此他应该在循环外比较相邻元素nums[left] == target

对于第二个问题,“元素是什么,不是mid吗?”: element代表nums中的当前成员,在循环中,它引用'nums [mid]',而在外部循环element中则引用nums[left]

希望我能理解他的意思以及您的意思,并让您了解我的意思。 :)