#-*- coding:utf-8 -*-
"""
--------------------------------------------------------------------
@function:
@time: 2020-10-27
@author:baoquan3
@version:
@modify:
--------------------------------------------------------------------
"""
import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding)
"""
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
"""
def binarySearch1(nums, target):
"""
模板1:
技巧点:
while 循环过程有等号,
循环内部有加入 与 target 相等情况判断
left、right 左右移动时,为 mid + 1 或 mid - 1
"""
if len(nums) == 0:
return -1
left, right = 0, len(nums) - 1
while left <= right: # 此处有等号
mid = left + (right - left) / 2
if nums[mid] == target: # 此处理加入 相等 时的判断,可避免左右收缩的问题
return mid
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
def binarySearch2(nums, target):
"""
模板二:
技巧点:
while 循环过程无等号,
left 向右移动时 left = mid + 1, right = mid
最后加入 nums[left] == target 的情况
"""
if len(nums) == 0:
return -1
left, right = 0, len(nums) - 1
while left < right: # 此处理无等号
mid = left + (right - left) / 2
if nums[mid] < target:
left = mid + 1 # 注意左、右中位数的选择,与左右收缩
else:
right = mid
if nums[left] == target: # 最后判断相等的情况
return left
return -1
def main():
nums = [-1,0,3,5,9,12]
target = 9
result = binarySearch1(nums, target)
# result = binarySearch2(nums, target)
print result
if __name__ == "__main__":
main()