二分搜索的三种模板

简介: 二分搜索的三种模板

1 查找target是否在数组中,没有返回-1

def binarySearch(nums, target):
    left, right = 0, len(nums) -1
    while left <= right:
        mid = (left + (right - left)) // 2
        if nums[mid] > target:
            right = mid - 1
        elif nums[mid] < target:
            left = mid + 1
        else:
            return mid
    # 没有就返回-1
    return -1

2 查找数组中第一个等于target的index, 没有返回-1

def binarySearch(nums, target):
    left, right = 0, len(nums) -1
    while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] >= target:
            right = mid - 1
        elif nums[mid] < target:
            left = mid + 1
    if left < len(nums) and nums[left] == target:
      return left
    # 没有就返回-1
    return -1

查找最后一个等于target下标,没有返回-1

  while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] > target:
            right = mid - 1
        elif nums[mid] <= target:
            left = mid + 1
    if right >= 0 and nums[right] == target:
      return right
    # 没有就返回-1
    return -1

查找第一个大于等于target的小标,没有返回-1

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

查找最后一个小于等于value的下标

结尾判断改为
 while left <= right:
   mid = left + (right - left )// 2
   if nums[mid] >= target:
    right = mid - 1
   elif nums[mid] < target:
    left = mid + 1
 if right >= 0:
  return right
 else:
  return -1

总结


所有的区间均为左闭右闭 [left, right]


  • 如果是找左边界,将等号挂在right分支上, 最后判断left

  • 如果是找右边界,将等号挂在left分支上, 最后判断right

非直接查找


  • 如果找大于目标的左边界,将等号挂在left分支,最后判断 left是不是 < len(nums)

  • 如果找小于目标的右边界,将等号挂在right分支,最后判断right是不是 >= 0

这个总结直接进行记忆

相关文章
|
存储 人工智能 安全
【实测分享】本地AI工具AiPy更新版本v0.1.28
AiPy是一款出色的本地AI工具,2025年5月21日发布v0.1.28版本。它以本地化处理保障数据隐私,新增Trustoken联网搜索、云端私密存储等功能,支持多模型选择如阿里Qwen与腾讯Hunyuan,优化任务处理逻辑,提升效率。操作便捷升级,新老用户均可轻松上手。未来还将推出GUI客户端2.0等新功能,值得期待!(下载地址:https://www.aipyaipy.com/#download)快来体验吧!
【实测分享】本地AI工具AiPy更新版本v0.1.28
|
人工智能 Java 测试技术
本地玩转 DeepSeek 和 Qwen 最新开源版本(入门+进阶)
本文将介绍如何基于开源工具部署大模型、构建测试应用、调用大模型能力的完整链路。
2355 122
|
Shell Linux 开发工具
三招教你轻松扩展 git bash 命令(上)(二)
GitBash 是 Windows 系统安装 Git 时默认集成的命令行工具,提供运行 Git 命令的集成环境.
三招教你轻松扩展 git bash 命令(上)(二)
|
编解码 大数据 定位技术
遥感数据、气象数据、土地土壤数据、农业数据、行政区数据...GIS数据获取网站整理
遥感数据、气象数据、土地土壤数据、农业数据、行政区数据...GIS数据获取网站整理
2732 2
|
存储 Java Python
Python 变量?对象?引用?赋值?一个例子解释清楚
Python 变量?对象?引用?赋值?一个例子解释清楚
|
编译器 C语言 C++
从C到C++
从C到C++
207 0
|
机器学习/深度学习 存储 人工智能
|
运维 供应链 负载均衡
《2023云原生实战案例集》——02 零售/电商/本地生活——震坤行 基于云原生高效提升应急供应链管理能力
《2023云原生实战案例集》——02 零售/电商/本地生活——震坤行 基于云原生高效提升应急供应链管理能力
|
Java 索引
Java 最常见面试题:Iterator 和 ListIterator 有什么区别?
Java 最常见面试题:Iterator 和 ListIterator 有什么区别?
|
前端开发 JavaScript 算法
React介绍
一、React课程目录介绍 二、React 简介