首页 > 其他分享 >二分(通俗易懂)

二分(通俗易懂)

时间:2024-08-17 09:49:26浏览次数:16  
标签:二分 int double mid 通俗易懂 SL check

二分查找

整数二分

先决条件:数据一定有序
下面是模版,只需要记住,然后套用即可

// 查找左边界 SearchLeft 简写SL
int SL(int l, int r)
{
    while (l < r)
    {
        int mid = (l + r) >> 1;
        if (check(mid)) r = mid; 
        else l = mid + 1; 
    }   
    return l;
}
// 查找右边界 SearchRight 简写SR 
int SR(int l, int r) 
{
    while (l < r)
    {                   
        int mid = l + r + 1 >> 1; // 需要+1 防止死循环
        if (check(mid)) l = mid;
        else r = mid - 1; 
    }
    return r; 
}
  • 记忆方面: 有加必有减

    int mid = l + r + 1 >> 1; 	// 加
    if (check(mid)) l = mid;
    else r = mid - 1;			// 减
    
  • 最后return的时候lr都是可以的,因为最后一定r == l(二分终止条件)

  • 对于查找特定的数

    • 存在

      • SL返回第一次出现的位置(下标较小)
      • SR返回最后一次出现的位置
    • 不存在

      • SL返回第一个比它小的数的位置

      • SR返回第一个比它大的数的位置

      • 示例:

        int arr[] = [1 2 4 5]; // 查找3
        // SL 返回2的下标 check(arr[mid] <= 3) 
        // SR 返回4的下标 check(arr[mid] >= 3)
        

左右边界通过下标区分

image-20240817093922691

浮点数二分

double bsearch_3(double l, double r)
{
    // 保留4为小数 则 1e-6
    // 保留6位小数 则 1e-8 加二即可 
    const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;//精度限制 因此不用+1
        else l = mid;
    }
    return l;
}

标签:二分,int,double,mid,通俗易懂,SL,check
From: https://www.cnblogs.com/General-xd/p/18364070

相关文章

  • C语言学习 --- 冒泡排序与二分查找
    冒泡排序 排序        从小到大顺序排 轮数        数据个数-1 每一次比较的次数      数据个数-1-当前的轮数      每次比较开始从下标为0的地方开始比较     轮数:0~<数据个数-1次数:0~<数......
  • D44 2-SAT+前缀优化+二分 CF587D Duff in Mafia
    视频链接: CF587DDuffinMafia-洛谷|计算机科学教育新生态(luogu.com.cn)#include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespacestd;constintN=500005;inthead[N],idx,ne[N*6],to[N*6];voidadd(intx,......
  • 代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素
     704.二分查找题目链接:https://leetcode.cn/problems/binary-search/1,左闭右闭publicintsearch(int[]nums,inttarget){intlow=0;inthigh=nums.length-1;while(low<=high){intmid=(high+low)/2;if(num......
  • 二分图最大匹配(匈牙利算法)
    二分图最大匹配(匈牙利算法)算法思路寻找增广路即一条以选中边开始,以选中边结束的路,它有一个重要的性质:选中边比未选中边多一.只需要不断贪心的找增广路,直到不存在为止具体实现以dfs(深度优先)为例1.从左部1号开始搜寻增广路2.令当前点编号为x遍历右部与x相连的点3.若当前......
  • 【代码随想录】一、数组:1.二分查找
    部分图文参考于:代码随想录-二分查找,本文仅作为个人学习使用,如有侵权,请联系删除。1.概念二分查找也称折半查找(BinarySearch),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,这里需要注意的是,我们的输入不一定是数组,也......
  • Java 实现 B树(通俗易懂)
    目录一.概念二.节点定义三.插入操作1.查找位置2.插入3.分裂四.B+树和B*树1.B+树2.B*树一.概念B树是一颗多叉平衡树,空树也是多叉平衡树。一颗M阶的B树要满足以下条件:1.根节点至少有两个孩子;2.每个非根节点至少有(上取整)个关键字,至多有个关键字,并且以升序排列......
  • wqs二分 学习笔记
    wqs二分参考资料【学习笔记】WQS二分详解及常见理解误区解释-ikrvxt-CSDNwqs二分学习笔记-Leap_Frog-Luoguwqs二分详解-Hypoc_-CSDN前言2024.08.13模拟赛遇到恰好选\(k\)个的限制的反悔贪心做模拟费用流的题,然而不会wqs二分,改不完题,于是赶快学习wqs二分,遂要写下......
  • CF895B XK Segments 题解 二分
    题目链接:https://codeforces.com/problemset/problem/895/B题目大意给你一个长度为\(n\)的数列\(a_1,a_2,\ldots,a_n\)。求数列中存在多少个不同的下标对\((i,j)\)满足如下条件:\(a_i\lea_j\)并且恰好有\(k\)个整数\(y\)满足\(a_i\ley\lea_j\)且\(y\)......
  • hdu7462-字符串【SAM,二分】
    正题题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=7462题目大意你有一个由\(a,b\)组成的字符串\(s\)。有\(m\)个操作:询问有多少个本质不同的串\(t\)使得\(s[l,r]\)是\(t\)的子串且两个串在\(s\)中的出现次数相同。询问有多少个本质不同的串\(t\)......
  • CF1615H-Reindeer Games【保序回归,整体二分,网络流】
    正题题目链接:https://www.luogu.com.cn/problem/CF1615H题目大意有\(n\)个点,每个点有个初始权值\(a_i\),你每次可以让一个点权值\(+1\)或者\(-1\)。有\(m\)个限制要求某个点最终权值小于等于另一个点。求最少的操作次数使得满足所有限制。\(2\leqn,m\leq1000,1......