二分查找及变体

简介

二分查找(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         
相关推荐
冷雨夜中漫步7 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴7 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再7 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
颜酱9 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919109 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878389 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
喵手9 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934739 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy9 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
DuHz9 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理