首页 > 编程语言 >【算法】二分查找

【算法】二分查找

时间:2024-11-15 14:07:55浏览次数:1  
标签:二分 满足条件 target self mid 算法 查找 def

基本内容

提高在有序的数组中查找满足某一条件的索引

  • 二分查找的基本类型

    ① 有多种情况满足条件,找到满足条件的最右索引,例如找到值为4的最右索引(也可以换为小于5的最后一个元素)

​ ② 有多种情况满足条件,找到满足条件的最左索引,例如找到大于4的第一个元素...

​ ③ 仅存在一种满足条件的情况,①、②代码都适用

[!note]

可以发现,针对①、②两种情况,可以有不同的问法,例如在②情况中,也可以适用于找到4的最后一个元素,只需要在找到的索引上减一即可找到

  • 基本模板

① 情况

def binary_search(self, l, r, target): 
    while l < r:
        mid = (l + r + 1) // 2  
        if 满足条件:
            l = mid # 因为可能是最右情况,所以要保持不变,不能是 mid + 1, 又因为是需要找到最右情况,所以需要通过l往r逼近
        else:
            r = mid - 1
    return l

② 情况

def binary_search(self, l, r, target): 
    target = l
    while l < r:
        mid = (l + r) // 2  
        if 满足条件:
            r = mid #需要找到最左的情况,所以需要通过r往l逼近
        else:
            l = mid + 1 
    return l
  • 入门例子

查找有序数列中值为4的最后一个元素,[1,3,4,4,4,4,6,8,9]

​ 可以用①、②两种代码解决

条件为小于等于4为情况①

def binary_search(self, l, r, target): 
    while l < r:
        mid = (l + r + 1) // 2  
        if array[mid] <= 4:
            l = mid 
        else:
            r = mid - 1
    return l

条件为大于4为情况②,只需在最后输出的时候进行减一操作

def binary_search(self, l, r, target): 
    target = l
    while l < r:
        mid = (l + r) // 2  
        if array[mid] > 4:
            r = mid
        else:
            l = mid + 1 
    return l - 1 # 因为找到的是大于4的第一个元素6,所以还需要减一操作

题目

二分查找往往需要和其他类型的算法结合,所以题目所需涉及的内容不只是二分查找

  1. 3261. 统计满足 K 约束的子字符串数量 II

滑动窗口 前缀和 二分查找

class Solution:
    def __init__(self):
        self.lefts = None
        self.pre = None
    def binary_search(self, l, r):
        target = l
        while l < r:
            mid = (l + r) // 2  
            if self.lefts[mid] > target:
                r = mid
            else:
                l = mid + 1
        return l - 1
    def countKConstraintSubstrings(self, s: str, k: int, queries: List[List[int]]) -> List[int]:
        self.pre = [0] * (1 + len(s))
        self.lefts = [-1] * len(s)
        left = 0
        cnt = [0, 0]
        ans = []
        for right, x in enumerate(s):
            cnt[ord(x) % 2] += 1
            while cnt[0] > k and cnt[1] > k: 
                cnt[ord(s[left]) % 2] -= 1
                left += 1
            
            self.lefts[right] = left
            self.pre[right + 1] = self.pre[right] + (right - left + 1)

        for i,j in queries:
            if i > self.lefts[j] :
                ans.append( (j - i + 2)*( j -i + 1)//2)
            else:
                h = self.binary_search(i, j)
                ans.append(self.pre[j+1] - self.pre[h+1] + (h-i + 2)*(h-i +1)//2)
        return ans

标签:二分,满足条件,target,self,mid,算法,查找,def
From: https://www.cnblogs.com/DLShark/p/18547871

相关文章

  • 视频智能分析网关反光衣检测算法在提升工人安全意识方面有哪些优势?
    在工业自动化和智能制造的浪潮中,工作场所的安全监控正变得越来越重要。反光衣检测视频分析网关正是为了满足这一需求而设计的高性能、低功耗的AI边缘计算硬件设备。以下是对视频智能分析网关视频分析网关的介绍,以及反光衣检测算法在提升工人安全意识方面的优势分析。一、产品介......
  • 某app最新版 vmp算法分析一
    本系列预计3篇某app使用了一种X开头的HTTP签名。该应用程序对服务器的请求在其标头中有6个x签名。该应用程序通常使用此签名来确保数据的安全性和完整性。代号花露水.6个x签名都来自古希腊神话中的某个神.分别是蛇发女妖(G),柯罗诺斯(K,时间之神),拉顿(L),阿尔戈斯(A),赫利......
  • Java 常用加密解密算法
    Java常用加密解密算法 概要  加密算法是一种用数学方法对数据进行变换的技术,目的是保护数据的安全,防止被未经授权的人读取或修改。加密算法可以分为三大类:对称加密算法、非对称加密算法和哈希算法(也叫摘要算法)。  本文来梳理下开发中常用到的数据编码中的Base64以及常......
  • 百度 2025届秋招提前批 文心一言大模型算法工程师
    文章目录个人情况一面/技术面1h二面/技术面1h三面/技术面40min个人情况先说一下个人情况:学校情况:211本中9硕,本硕学校都一般,本硕都是计算机科班,但研究方向并不是NLP,而是图表示学习论文情况:1A(NeurIPS)+1B(ICDM)已录用,还有一篇A会(AAAI2025)最近快出结果了,以及一......
  • 重生之我在学Java算法系列(一)
    一.题目评委打分需求:在唱歌比赛中,有6名评委给选手打分,分数范围是(0-100]之间的整数。选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分二.做一道题目最重要的点在于需求分析如题一所示首先我们需要什么六名评委的分数第二......
  • 如何使用混合搜索来查找电子商务产品目录
    作者:来自Elastic AndreLuiz了解如何使用混合搜索来构建电子商务产品目录,使用分面、促销、个性化和行为分析。在本文中,我们将演示如何实现将全文搜索的结果与向量搜索相结合的混合搜索。通过统一这两种方法,混合搜索可以扩大结果的广度,充分利用两种搜索策略的优势。除了......
  • 从零开始:数学建模算法汇总之MATLAB与Python在建模中的应用对比
    目录从零开始:数学建模算法汇总之MATLAB与Python在建模中的应用对比前言最小二乘法数值分析方法数值分析方法图论算法线性规划整数规划动态规划贪心算法分支定界法蒙特卡洛方法随机游走算法遗传算法粒子群算法神经网络算法人工智能算法模糊数学时间序列分析......
  • 昂首资本:保守型投资者的交易策略与趋势EA算法解析
    昂首资本经常看到投资者在金融市场上寻求稳健的交易策略。然而并非所有投资者都倾向于冒险,也并非所有策略都与职业发展紧密相关。事实上,保守型投资者和投机型投资者之间的差异,往往在于他们对待风险的态度和选择的交易方法。结果,保守型投资者更倾向于避免高风险的套利交易,转......
  • leetcode 数组专题 06-扫描线算法(Sweep Line Algorithm)
    扫描线专题leetcode数组专题06-扫描线算法(SweepLineAlgorithm)leetcode数组专题06-leetcode.218the-skyline-problem力扣.218天际线问题leetcode数组专题06-leetcode.252meetingroom力扣.252会议室leetcode数组专题06-leetcode.253meetingroomii力扣.253......
  • 排序算法——冒泡排序
    目录一、冒泡排序的原理二、冒泡排序的过程三、代码实现总结一、冒泡排序的原理冒泡排序是一种简单的排序算法,它通过从左往右依次遍历,比较相邻元素的大小,并根据需要交换它们的位置来排序数据,以升序为例,这个过程类似空中的泡泡,重量大的往下沉,重量小的往上浮,从而得名冒泡......