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

二分查找及变体

简介

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

常见的用法有三种:

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

练习题

704. 二分查找

思路

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

代码

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位置即为待插入的位置。

代码

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:每次把区间往右边压缩,结束时判断边界元素

代码

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         

http://www.kler.cn/a/319543.html

相关文章:

  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • 性能测试|JMeter接口与性能测试项目
  • SpringCloud学习笔记
  • Unity学习笔记(4):人物和基本组件
  • 冗余连接2 hard题 代随C#写法
  • python装饰器的使用以及私有化
  • Linux系统(Ubuntu)(下载篇)
  • [SDX35+WCN6856]SDX35 +WCN6856 remount firmware出现失败问题原因及解决方案
  • 在线海外代理IP科普:代理主机与代理端口号的作用
  • MATLAB无线网络设计工具:从理论到实践
  • 任意长度并行前缀和 扫描算法 《PMPP》笔记
  • 接口加解密及数据加解密
  • 动手学深度学习(李沐)PyTorch 第 1 章 引言
  • 新零售社交电商系统的卷轴模式开发:重塑消费体验与商业生态
  • 格雷母线电缆头安装方法视频-武汉正向科技
  • MySQL自定义排序:使用ORDER BY FIELD实现灵活的数据排序
  • 【Java 问题】基础——Java 概述
  • 机器学习周报(9.16-9.22)-Pytorch学习(四)
  • 昇思量子计算系列教程-龙算法
  • 【Webpack】Hash 码
  • 15.10 在k8s部署grafana-deployment并导入k8s大盘
  • 计算机视觉的应用34-基于CV领域的人脸关键点特征智能提取的技术方法
  • N诺计算机考研-错题
  • 企业EMS -能源管理系统-能源在线监测平台
  • C# .net6 开发数据采集软件(一)
  • 关于 NLP 应用方向与深度训练的核心流程