二分查找及变体

简介

二分查找(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         
相关推荐
懒大王爱吃狼几秒前
Python绘制数据地图-MovingPandas
开发语言·python·信息可视化·python基础·python学习
数据小小爬虫3 分钟前
如何使用Python爬虫按关键字搜索AliExpress商品:代码示例与实践指南
开发语言·爬虫·python
Ritsu栗子9 分钟前
代码随想录算法训练营day35
c++·算法
MrZhangBaby11 分钟前
SQL-leetcode—1158. 市场分析 I
java·sql·leetcode
好一点,更好一点19 分钟前
systemC示例
开发语言·c++·算法
martian66526 分钟前
第17篇:python进阶:详解数据分析与处理
开发语言·python
无码不欢的我30 分钟前
使用vscode在本地和远程服务器端运行和调试Python程序的方法总结
ide·vscode·python
五味香31 分钟前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
金融OG37 分钟前
99.8 金融难点通俗解释:净资产收益率(ROE)
大数据·python·线性代数·机器学习·数学建模·金融·矩阵
卷卷的小趴菜学编程40 分钟前
c++之List容器的模拟实现
服务器·c语言·开发语言·数据结构·c++·算法·list