二分查找及变体

简介

二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性 ,每轮缩小一半 搜索范围,直至找到目标元素或搜索区间为空为止。

学习视频:代码随想录-二分查找

常见的用法有三种:

  • 查找目标元素的位置:即目标元素的位置
  • 查找目标元素的下界(lower bound):小于目标元素的第一个位置
  • 查找目标元素的上界(upper bound):大于目标元素的第一个位置

练习题

704. 二分查找

思路

  • 经典的二分查找;
  • 直接实现即可。

代码

python 复制代码
class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        l, r = 0, len(nums) - 1
        while(l <= r):
            m = l + (r - l) // 2
            if nums[m] > target:
                r = m - 1
            elif nums[m] < target:
                l = m + 1
            else:
                return m
        return -1

35. 搜索插入位置

思路

  • 类lowerbound查找;
  • 时刻清楚边界的条件:while结束时区间情况为[r, l],r位置元素比target小,l位置即为待插入的位置。

代码

python 复制代码
class Solution(object):
class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        l, r = 0, len(nums) - 1
        while l <= r:
            m = l + (r - l) // 2
            if nums[m] > target:
                r = m - 1
            elif nums[m] < target:
                l = m + 1
            else:
                return m
        return l

34. 在排序数组中查找元素的第一个和最后一个位置

思路

  • 考虑upperbound和lowerbound
  • lowerbound::每次把区间往左边压缩,结束判断边界元素
  • upperbound:每次把区间往右边压缩,结束时判断边界元素

代码

python 复制代码
class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums)
        if n == 0:
            return [-1, -1]
        elif n == 1:
            return [0, 0] if nums[0] == target else [-1, -1]
            
        l, r = 0, n - 1
        ans = [-1, -1]
        while l <= r: // lower bound
            m = (l + r) // 2
            if nums[m] >= target:
                r = m - 1
            else:
                l = m + 1
        if l < n and nums[l] == target:
            ans[0] = l

        l, r = 0, n - 1
        while l <= r: // upper bound
            m = (l + r) // 2
            if nums[m] > target:
                r = m - 1
            else:
                l = m + 1
        if r < n and nums[r] == target:
            ans[1] = r
        return ans         
相关推荐
KyollBM5 分钟前
每日羊题 (质数筛 + 数学 | 构造 + 位运算)
开发语言·c++·算法
F_D_Z2 小时前
数据集相关类代码回顾理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter
python·torchvision·transforms
Univin2 小时前
C++(10.5)
开发语言·c++·算法
Asmalin2 小时前
【代码随想录day 35】 力扣 01背包问题 一维
算法·leetcode·职场和发展
剪一朵云爱着2 小时前
力扣2779. 数组的最大美丽值
算法·leetcode·排序算法
qq_428639612 小时前
虚幻基础:组件间的联动方式
c++·算法·虚幻
深瞳智检3 小时前
YOLO算法原理详解系列 第002期-YOLOv2 算法原理详解
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
tao3556673 小时前
【Python刷力扣hot100】283. Move Zeroes
开发语言·python·leetcode
怎么没有名字注册了啊3 小时前
C++后台进程
java·c++·算法
小宁爱Python4 小时前
从零搭建 RAG 智能问答系统1:基于 LlamaIndex 与 Chainlit实现最简单的聊天助手
人工智能·后端·python