二分查找及变体

简介

二分查找(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         
相关推荐
沃斯堡&蓝鸟17 小时前
DAY28 元组和OS模块
python·元组与os模块
皮卡蛋炒饭.17 小时前
背包问题Ⅱ与二分问题
算法
baby_hua17 小时前
20251011_Pytorch从入门到精通
人工智能·pytorch·python
Code Slacker17 小时前
LeetCode Hot100 —— 普通数组(面试纯背版)(五)
数据结构·c++·算法·leetcode·面试
中年程序员一枚17 小时前
Nginx配置运行python的uvicorn项目
chrome·python·nginx
sin_hielo17 小时前
leetcode 3573(买卖股票问题,状态机dp)
数据结构·算法·leetcode
逆向新手17 小时前
js逆向-某省特种设备aes加密研究
javascript·爬虫·python·逆向·js
暗之星瞳17 小时前
PYTHON学习——决策树
python·学习·随机森林
flashlight_hi17 小时前
LeetCode 分类刷题:110. 平衡二叉树
javascript·算法·leetcode
清水白石00817 小时前
《用 Python 单例模式打造稳定高效的数据库连接管理器》
数据库·python·单例模式