蓝桥杯随笔练——二分模板

答案

#include <bits/stdc++.h>
//洛谷2249
using namespace std;

const int N = 1e6+10;
int n,m;
int a[N];

int Array_Search(int a[],int len,int x)
{
	int L = 0,R = len+1;
	while(L+1 < R)
	{
		int mid = (R+L) >> 1;
	
		if(a[mid] < x ) L = mid;
		else R = mid;
	}
	if(a[R] == x) return R;
	return -1;
}

int main() {
	cin >> n >> m;
	for(int i = 1;i<=n;i++)
	{
		cin >> a[i];
	}
	sort(a+1,a+1+n);
	
	for(int i = 1;i<=m;i++){
		int t ;
		cin >> t;
		int res = Array_Search(a,n,t);
		cout << res << " ";
	}
	
	return 0;
}

思路:

        对于二分题,第一件事就是考虑题目给出的数组是否是按升序,或者降序排列的。如果不是,那么先进行处理数组。

        对于Array_Search函数,一般都是传入三个量,分别是数组长度待查数

        无论是查找一个数出现第一次的下标,还是最后一次的下标。L与R都应该放在数组的两侧,而不是待查找数组内部

        最后一次出现的下标

int Array_search2(int a[],int len,int x)
{
	int L = 0,R = len+1;
	while(L+1 < R)
	{
		int mid = (R+L) >> 1;
	
		if(a[mid] <= x ) L = mid;
		else R = mid;
	}
	if(a[L] == x) return L;
	return -1;
}

      次出现的下标

int Array_Search(int a[],int len,int x)
{
	int L = 0,R = len+1;
	while(L+1 < R)
	{
		int mid = (R+L) >> 1;
	
		if(a[mid] < x ) L = mid;
		else R = mid;
	}
	if(a[R] == x) return R;
	return -1;
}

       重点是while内的判断条件,if内的判断条件,if后的执行条件,return的判断条件和返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值