二分查找(my理解和模板)

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 之前先学了y总的二分,后来又看了代码随想录的,感觉代码随想录的更好记忆

之前先学了y总的二分,后来又看了代码随想录的,感觉代码随想录的更好记忆

二分查找需要的数据必须是有序的。如果数据没有序,我们需要先排序,排序的时间复杂度最低是 O(nlogn)。

二分查找底层依赖的是数组,数组需要的是一段连续的存储空间,所以数据量太大不适合二分查找

查找的方法,顾名思义,就是若 target = arr[mid],则查找成功(找到了目标值)返回 mid 值

🚥🚥🚥

根据check()来划分区间

🚥🚥🚥

⭐整数二分

划分为[l,mid]和[mid+1,r]  

int binary(int l,int r){
  while(l<r){
    int mid=(l+r)/2;
    if(check(mid)) r=mid;
    else l=mid+1;
  }
  return l;
}

划分为[l.mid-1]和[mid,r]

int binary(int l,int r){
  while(l<r){
    int mid=(l+r+1)/2;
    if(check(mid)) l=mid;//如果先是l=mid,那么为(l+r+1).要+1
    else r=mid+1;
  }
  return l;
}

浮点数二分

int binary(int l,int r){
  while(l-r>0.001){ //0.001可以又其他浮点数代替,但是都必须尽可能小
    int mid=(l+r)/2;
    if(check(mid)) r=mid;//l=mid
    else l=mid;          //r=mid
  }                        //根据check()决定
  return l;
}

35. 搜索插入位置 - 力扣(LeetCode)

1.1.png

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
       int l=0,r=nums.size();
       while(l<r)
       {
           int mid=(l+r)/2;
           if(nums[mid]>target) r=mid;
           else if(nums[mid]<target) l=mid+1;
           else
           return mid;
       }
       return l;
    }
};

P1024 [NOIP2001 提高组] 一元三次方程求解 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

1.2.png

#include<cstdio>
double a,b,c,d;
double fc(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
    double l,r,mid,x1,x2;
    int s=0,i;
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);  
    for (i=-100;i<100;i++)
    {
        l=i; 
        r=i+1;
        x1=fc(l); 
        x2=fc(r);
        if(!x1) 
        {
            printf("%.2lf ",l); 
            s++;
        }      //判断左端点,是零点直接输出。
                        //不能判断右端点,会重复。
        if(x1*x2<0)  //区间内有根。
        {
            while(r-l>=0.001)  //二分控制精度。
            {
                mid=(l+r)/2;  
                if(fc(mid)*fc(r)<=0) 
                   l=mid; 
                else 
                   r=mid;   //计算中点处函数值缩小区间。
            }
            printf("%.2lf ",r);  
            //输出右端点。
            s++;
        }
        if (s==3) //每找到一个,s++,当s=3时,就找到了3个
            break;             
    }
    return 0;
}

下面这个题可以体会到check()选择区间的条件

789. 数的范围 - AcWing题库

得用两次二分,找到左右两个值

1.3.png

#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int q[N];
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);
    while (m -- )
    {
        int x;
        scanf("%d", &x);
        int l = 0, r = n - 1;
        while (l < r)
        {
            int mid = l + r >> 1;
            if (q[mid] >= x) r = mid;//>=x
            else l = mid + 1;
        }
        if (q[l] != x) cout << "-1 -1" << endl;
        else
        {
            cout << l << ' ';
            int l = 0, r = n - 1;
            while (l < r)
            {
                int mid = l + r + 1 >> 1;
                if (q[mid] <= x) l = mid;//<=x
                else r = mid - 1;
            }
            cout << l << endl;
        }
    }
    return 0;
}

P8647 [蓝桥杯 2017 省 AB] 分巧克力 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

1.4.png

建议听听这个视频讲解http://【P8647 [蓝桥杯 2017 省 AB] 分巧克力】https://www.bilibili.com/video/BV1sx4y1L7Xq?vd_source=21581d752de8daca00ef38561a7264f6

或者

AcWing 1227. 分巧克力(寒假每日一题) - AcWing  


image.pngimage.png

image.png

注意是长和宽,得开二维数组

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, k;
int h[N], w[N];
bool check(int mid)
{
    int res = 0;
    for (int i = 0; i < n; i ++ )
    {
        res += (h[i] / mid) * (w[i] / mid);
        if (res >= k) return true;
    }
    return false;
}
int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i ++ ) scanf("%d%d", &h[i], &w[i]);
    int l = 1, r = 1e5;
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    printf("%d\n", r);
    return 0;
}

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
6月前
树状数组模板
树状数组模板
40 0
|
4月前
|
算法
二分 模板
二分的另一个板子
35 1
|
5月前
|
Java Python
二分查找模板
二分查找模板
|
6月前
|
Python
{二分模板}
{二分模板}
24 0
|
6月前
线段树模板
线段树模板
44 0
|
机器学习/深度学习
P1873 砍树(二分查找模板)
P1873 砍树(二分查找模板)
123 0
|
机器学习/深度学习 人工智能 搜索推荐
P1177 【模板】快速排序(二分排序)
P1177 【模板】快速排序(二分排序)
80 0
|
编译器 C语言 C++
C++ 冒泡排序,模板
C++ 冒泡排序,模板
二分搜索的三种模板
二分搜索的三种模板
67 0
|
存储 算法
线段树模板与练习
线段树模板与练习
101 0