二分基本实现

模板

一般题目看到,最大,最小时优先考虑二分

c 复制代码
//将区间分为 [l,mid-1]
int erfen1(int l,int r)
{
	while(l<r)
	{
    	int mid=(l+r+1)/2;
    	if(check())
    	l=mid;
    	else
    	r=mid-1;
	}
	return l;
}

//将区间分为 [mid+1,r]
int erfen2(int l,int r)
{
    while(l<r)
    {
        int mid=(l+r)/2;
        if(check())
            l=mid+1;
        else
            r=mid;
    }
    return l;
}

//浮点数二分
int erfen3(double l,double r)
{
    const int eps=1e-6; //表示精度,取决于题目得要求
    while(l-r>eps)
    {
        double mid=(l+r)/2;
        if(check())r=mid;
        l=mid;
    }
    return l;
}

例题1

例1:1-10中找6

c 复制代码
#include<iostream>
using namespace std;
int z[10010];
int k;
bool check(int x) 
{
	if (z[x] < k)
		return 1;
	else
		return 0;
}
int main()
{
	int l = 1, r = 10;
	for (int int mi = 1; i <= 10; i++)
	{
		cin >> z[i];
	}
	cin >> k;
	while (l < r)
	{
		int mid = (l + r) / 2;
		if (check(mid)) //如果中间的数小于要寻找的数 l = 中间的数+1;
			l = mid + 1;
		else
			r = mid; // 否则右边的数等于中间的数字;
	}
	cout << l;
	return 0;
}      

输入:1 2 3 4 5 6 7 8 9 10 6

输出:6

例题2

例2:n个数字中最早出现m的位置(最小下标)

c 复制代码
#include<iostream>
using namespace std;
int z[10010];
int m;
bool check(int x)
{
	if (z[x] < m)
		return 1;
	else
		return 0;
}
int main()
{
	int n;
	cin >> n >> m;
	int l = 1, r = n;
	for (int i = 1; i <= n; i++)
	{
		cin >> z[i];
	}
	while (l < r)
	{
		int mid = (l + r) / 2;
		if (check(mid))
			l = mid + 1;
		else
			r = mid;
	}
	cout << l;
	return 0;
}

输入:7 4

​ 1 2 3 4 4 4 5

输出:4

例题3

例3:n个数字中最晚出现m的位置(最大下标)

c 复制代码
#include<iostream>
using namespace std;
int z[10010];
int m;
bool check(int x)
{
	if (z[x] <= m)
        return 1;
	else
		return 0;
}
int main()
{
	int n;
	cin >> n >> m;
	int l = 1, r = n;
	for (int i = 1; i <= n; i++)
	{
		cin >> z[i];
	}
	while (l < r)
	{
		int mid = (l + r + 1) / 2;
		if (check(mid))
			l = mid;
		else
			r = mid-1;//r-1后mid要+1
	}
	cout << l;
	return 0;
}

输入:7 4

​ 1 2 3 4 4 4 5

输出:6

相关推荐
大鱼>5 分钟前
AI+货物追踪:全链路货物可视化追踪系统
人工智能·深度学习·算法·机器学习
大江东去浪淘尽千古风流人物10 分钟前
【SLAM】slam高动态位姿估计全链路拆解
算法·面试·职场和发展·视觉里程计·slam·vio·大疆
想你依然心痛12 分钟前
量子计算对嵌入式密码学的挑战与后量子算法准备
算法·密码学·量子计算
Jerry4 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry6 小时前
LeetCode 459. 重复的子字符串
算法
海石9 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石9 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry10 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding11 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL12 小时前
我的数据结构3——链表(link list)
数据结构·链表