基础二分查找

#-*- 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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值