当前位置: 首页 > news >正文

Leetcode-100 二分查找常见操作总结

二分查找常见操作总结

1. 基本二分查找

目标: 在有序数组 nums 中查找 target 的索引(如果存在)。

适用场景:

  • 需要在 有序数组 中查找某个特定元素。
  • 适用于无重复元素的情况。

示例:
输入 nums = [1, 2, 3, 4, 5], target = 3,输出 2

def binary_search(nums, target):
    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
    return -1  # 没找到

2. 查找左边界(Lower Bound)

目标: 找到 第一个 大于等于 target 的元素索引。

适用场景:

  • 用于查找 某个值的最左侧出现位置,如查找元素插入的位置。
  • 有重复元素 时,找到 target 最左边的位置。

示例:
输入 nums = [1, 2, 2, 2, 3], target = 2,输出 1

def lower_bound(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return left  # 返回的是第一个大于等于 target 的索引

3. 查找右边界(Upper Bound)

目标: 找到 第一个 大于 target 的元素索引。

适用场景:

  • 需要获取比目标值大的第一个位置
  • 可用于计算某个值的出现次数。

示例:
输入 nums = [1, 2, 2, 2, 3], target = 2,输出 4

def upper_bound(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] <= target:
            left = mid + 1
        else:
            right = mid - 1
    return left  # 返回的是第一个大于 target 的索引

4 查找插入位置

目标: 找到 target 应该插入 的位置。

适用场景:

  • 需要在 有序数组 中插入一个新元素,并保持有序性。
  • 可用于 二分搜索的变体,比如寻找目标元素的最左/最右位置。

示例:
输入 nums = [1, 3, 5, 6], target = 5,输出 2

def search_insert_position(nums, target):
    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
    return left  # 返回插入位置

5. 寻找旋转排序数组中的最小值

目标: 在 旋转排序数组 中找到 target

适用场景:

  • 需要在 部分有序数组(如旋转排序数组)中进行二分查找。
  • nums 在某个位置发生了 旋转,但仍然部分有序。

示例:
输入 nums = [4, 5, 6, 7, 0, 1, 2], target = 0,输出 4

    def findMin(nums: List[int]) -> int:
        left, right = 0, len(nums) - 1  # 闭区间 [0, n-1]
        while left < right:  # 只要区间不缩至一个元素
            mid = (left + right) // 2
            if nums[mid] > nums[right]:  # mid 在左半部分
                left = mid + 1  # 缩小左边界
            else:  # mid 在右半部分
                right = mid  # 缩小右边界,保持 `right` 包含在内
        return nums[left]  # 最终 `left == right`,即最小值下标

二分查找常见操作对比表

操作目标适用场景返回值示例输入示例输出
基本二分查找在有序数组中查找目标值的索引数组 无重复元素,查找某个特定元素目标值的索引,若不存在返回 -1nums = [1,2,3,4,5], target = 32
查找左边界 (Lower Bound)找到第一个大于等于 target 的元素索引有重复元素,查找 target 最左侧的位置target 在数组中的最左索引,若不存在返回插入位置nums = [1,2,2,2,3], target = 21
查找右边界 (Upper Bound)找到第一个大于 target 的元素索引有重复元素,查找 target 右侧界限返回大于 target 的第一个索引nums = [1,2,2,2,3], target = 24
查找插入位置找到 target 应插入的位置在有序数组中插入新元素,并保持有序性target 应插入的位置nums = [1,3,5,6], target = 52
寻找旋转排序数组中的最小值在旋转排序数组中找到最小值旋转排序数组数组中的最小值nums = [4,5,6,7,0,1,2]0
http://www.dtcms.com/a/108619.html

相关文章:

  • 数据点燃创新引擎:数据驱动的产品开发如何重塑未来?
  • Airflow量化入门系列:第一章 Apache Airflow 基础
  • 红宝书第二十五讲:客户端存储(Cookie、localStorage、IndexedDB):浏览器里的“记忆盒子”
  • Leetcode 6233 -- DFS序列 | 两遍DFS
  • Vue中JSEncrypt 数据加密和解密处理
  • Firefox账号同步书签不一致(火狐浏览器书签同步不一致)
  • wireshak抓手机包 wifi手机抓包工具
  • linux 时钟
  • 【爬虫】网页抓包工具--Fiddler
  • 【Audio开发二】Android原生音量曲线调整说明
  • LInux基础指令(二)
  • 【VS+Qt】vs2022打开 vs2015项目
  • FastAPI中Pydantic异步分布式唯一性校验
  • 机器视觉调试——现场链接相机(解决各种相机链接问题)
  • 自然语言处理(22:(第六章2.)​seq2seq模型的实现​)
  • 图片懒加载、无限滚动加载、监听元素进入视口加载数据。「IntersectionObserver」
  • scala编程语言
  • 服务器数据恢复—Raid6阵列硬盘故障掉线,上层虚拟机数据如何恢复?
  • linux-firewalld防火墙允许端口
  • 【SLAM经典算法详解】Ubuntu 20.04部署LeGO-LOAM:从环境配置到KITTI适配,解决常见编译错误
  • 从零开发美颜SDK:美颜滤镜API的核心技术与实现
  • 多视图几何--立体校正--Fusiello方法
  • CMake学习--如何在CMake中编译静态库、动态库并在主程序中调用
  • rag精细化测试
  • 论坛系统的测试
  • win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目1
  • Docker in Docker(Dind)
  • 深入解析 Git Submodule:从基础到高级操作指南
  • 电子电气架构 --- 控制器级架构
  • 基于HTML5的拖拽排序功能实现详解