我读了两个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
总结关键属性:
- 二进制搜索的大多数基本形式和基本形式
无需确定元素的邻居即可确定搜索条件(或使用周围的特定元素)
不需要后处理,因为在每个步骤中,您都在检查是否已找到该元素。如果到达末尾,则说明找不到该元素
参考属性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
是什么,不是中间吗?
我可能会陷入困境,能否请您提供一些帮助的提示?
答案 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]
希望我能理解他的意思以及您的意思,并让您了解我的意思。 :)