美文网首页
leetcode--二分查找模板总结(python3)

leetcode--二分查找模板总结(python3)

作者: FF_b0bf | 来源:发表于2020-10-19 11:28 被阅读0次

1、基本二分

def binarySearch(nums, target):
    left = 0
    right = len(nums) - 1
    while left <= right:  #终止条件
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid - 1
    return -1

思考:
为什么终止条件为 left <= right,因当 left == right,也就代表在一个元素中搜索,意味着 mid == left == right,当寻找到最后一个元素都无解时,则退出

基本二分的缺陷:
当nums中包含重复元素时 nums = [2,2,3,3], 你无法控制你查到的是左侧的target还是右侧的target,进一步抽象也就是你无法控制target的边界。

2、 寻找左侧边界的二分搜索

def left_bound(nums, target):
    if len(nums) == 0: return -1
    left = 0
    right = len(nums) # 注意不同点

    while left < right: # 注意不同点
        mid = (left + right) //2
        if nums[mid] == target:
            right = mid
        elif nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid #注意不同点
    return left

思考:
终止条件为何不同了?
--因为搜索的区间[left, right] 变为了[left, right)
更新操作为何不同了?
--与上同理
最终返回的为什么是left?
--由于终止条件变为了left == right , 所以返回谁都无所谓
右侧边界呢?
--对照改变当nums[mid] == target成立时的更新操作与返回的条件即可

3、 寻找右侧边界的二分搜索

def right_bound(nums, target):
    if len(nums) == 0: return -1
    left = 0
    right = len(nums)

    while left < right: 
        mid = (left + right) //2
        if nums[mid] == target:
            left = mid + 1 #注意不同点
        elif nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid 
    return left - 1 #注意不同点

参考文献:
https://labuladong.gitbook.io/algo/suan-fa-si-wei-xi-lie/er-fen-cha-zhao-xiang-jie

相关文章

  • leetcode--二分查找模板总结(python3)

    1、基本二分 思考:为什么终止条件为 left <= right,因当 left == right,也就代表在一个...

  • 二分查找

    [TOC] 二分查找的基础模板 二分查找靠左的Index基础模板 二分查找靠右的Index基础模板 二分查找插入t...

  • Algorithm进阶计划 -- 二分搜索

    二分搜索二分搜索模板二分搜索运用 1. 二分搜索模板 二分搜索(二分查找)也称折半查找(Binary Search...

  • 二分查找模式

    二分查找通用的模板int mid = (left + right) / 2容易溢出 二分查找的通用模板 使用“左边...

  • 二分查找总结

    二分查找是在每次匹配后,将查找的空间一分为二的算法,二分查找应该是有序的数组进行查找. 二分查找模板 1. 模板一...

  • leetcode--二分查找专题

    1、插入位置:34、704、981 leetcode-34--在排序数组中查找元素的第一个和最后一个位置leetc...

  • LeetCode 专题 :二分查找

    LeetCode 第 704 题是二分查找的模板问题。 LeetCode 第 704 题:二分查找 传送门:704...

  • LeetCode 数组专题 1:二分查找

    二分查找法 说明:二分查找法在代码实现上有模板方法,一定要掌握。 1、二分查找法的使用前提:数组一定要是排好序的,...

  • leetcode--并查集模板总结(python3)

    问题介绍:并查集一般用来解决连通性方面的问题,最典型的比如图的连通性,与邻接表配合最佳连通这个概念抽象出来的特点是...

  • 算法图解系列之二分查找[01]

    1.1 二分查找 1.2 二分查找的运行时间 1.3 大O表示法 1.4 总结

网友评论

      本文标题:leetcode--二分查找模板总结(python3)

      本文链接:https://www.haomeiwen.com/subject/xsrkmktx.html