首页 > 其他分享 >二分查找 理论 例题

二分查找 理论 例题

时间:2024-11-16 09:57:40浏览次数:1  
标签:二分 arr right int mid else 查找 例题 left

 

 

 

 

 

递归代码

int binary_search(int arr[],int left,int right,int key){
	if (left>right){//区间无效
		return -1;
	}
	int mid=left+(right-left)/2; //直接平均可能会溢出
	if(arr[mid]==key){
		return mid;
	}else if(key>arr[mid]){
		return binary_search(arr,mid+1,right,key); //右半区间继续查找
	}
	else{
		return binary_search(arr,left,mid-1,key); //左半区间继续查找
	}
}

 循环代码

//代码中 arr 表示数组,left 表示区间左边界, right 表示区间右边界,mid 表示中间位置
int binary_search(int arr[],int left,int right,int key){
	int ret=-1;//未搜索到数据返回-1
	int mid;//中间位置
	while(left<=right){//只要区间有效就继续
		mid=left+(right-left)/2; //直接平均可能会溢出
		if(arr[mid]==key){
			ret=mid;//找到
			break; 
		}
		else if(key>arr[mid]){//右半区间继续查找
			left=mid+1;
		}
		else{
			right=mid-1; //左半区间继续查找
		}
	}
	return ret; // 返回结果
}

1

#include<iostream>
using namespace std;
int main(){
	int a[5]={1,2,2,3,4};
	int n;
	cin>>n;
	int l=0,r=4;
	int m;
	while(l<=r){
		m=l+(r-l)/2;
		if(a[m]>=n){
			r=m-1;
		}else{
			l=m+1;
		}
		if(a[l]==n){
			cout<<l;
			return 0;
		}
		
	}
	cout<<-1;
}

2

#include<iostream>
using namespace std;
int main(){
	int a[5]={1,2,2,3,4};
	int n;
	cin>>n;
	int l=0,r=4;
	int m;
	while(l<=r){
		m=l+(r-l)/2;
		if(a[m]>n){
			r=m-1;
		}else{
			l=m+1;
		}
		if(a[r]==n){
			cout<<r;
			return 0;
		}
	}
	cout<<-1;
}

3

#include<iostream>
using namespace std;
int main(){
	int a[9]={1,4,5,8,10,10,12,13,15};
	int n;
	cin>>n;
	int l=0,r=8;
	int m;
	while(l<=r){
		m=l+(r-l)/2;
		if(a[m]>=n){
			r=m-1;
		}else{
			l=m+1;
		}
		if(a[l]>=n){
			cout<<l;
			return 0;
		}
	}
	cout<<-1;
}

4

 

#include<iostream>
using namespace std;
int main(){
	int a[9]={1,4,5,8,10,10,12,13,15};
	int n;
	cin>>n;
	int l=0,r=8;
	int m;
	while(l<=r){
		m=l+(r-l)/2;
		if(a[m]>n){
			r=m-1;
		}else{
			l=m+1;
		}
		if(a[r]<=n){
			cout<<r;
			return 0;
		}
	}
	cout<<-1;
}

  

标签:二分,arr,right,int,mid,else,查找,例题,left
From: https://www.cnblogs.com/wangyueshuo/p/18549043

相关文章

  • 二分
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ inta[8]; intt,L=0,R=4,M=0; cin>>t; for(inti=0;i<8;i++){ cin>>a[i]; } intx=1000; //12234 for(inti=0;L<=R;i++){ M=(L+R)/2; if(a[M]>t){ R=M-1; }......
  • 【RMBO-BILSTM分类预测2024新算法】红嘴蓝鹊优化算法RMBO优化双向长短期记忆神经网络
    %%清空环境变量warningoff%关闭报警信息closeall%关闭开启的图窗clear%清空变量clc%清空命令行tic%restoredefaultpath%%读取数据res=xlsread('数据集.xlsx');%%划分训练集和测试集%P_train=res(1:250,1:12)';T_train=res(1:250,13)';M......
  • 【算法】二分查找
    基本内容提高在有序的数组中查找满足某一条件的索引二分查找的基本类型①有多种情况满足条件,找到满足条件的最右索引,例如找到值为4的最右索引(也可以换为小于5的最后一个元素)​ ②有多种情况满足条件,找到满足条件的最左索引,例如找到大于4的第一个元素...​ ③仅存......
  • 如何使用混合搜索来查找电子商务产品目录
    作者:来自Elastic AndreLuiz了解如何使用混合搜索来构建电子商务产品目录,使用分面、促销、个性化和行为分析。在本文中,我们将演示如何实现将全文搜索的结果与向量搜索相结合的混合搜索。通过统一这两种方法,混合搜索可以扩大结果的广度,充分利用两种搜索策略的优势。除了......
  • NOIP 复习题之二分图
    CF741C有\(2n\)个人围成一圈坐在桌子边上,每个人占据一个位子,对应这\(2n\)个人是\(n\)对情侣,要求情侣不能吃同一种食物,并且桌子上相邻的三个人的食物必须有两个人是不同的,只有两种食物,问一种可行分配方式。思路:我们在两个点之间连边,表示他们吃的不一样。然后对于点对\((......
  • 二分——E. Klee's SUPER DUPER LARGE Array!!!
    题目Klee有一个数组a长度n包含整数[K,K+1,...K+n]按此顺序。Klee想要选择一个索引i(1<=i<=n),使得x=|a1+a2+...+ai-ai+1-...-an|最小化。请注意,对于任意整数z,|z|表示x.输出x.输入第一行包含t(1≤t≤1e4)—测试用例的数量。每个测试用例包含两个整数n和k(2≤n,k≤109)—数......
  • 代码随想录算法训练营第一天| 704. 二分查找、35.搜索插入位置、27. 移除元素、977.有
    文档讲解:代码随想录视频讲解:代码随想录状态:完成4道题一、数组理论基础数组:连续内存空间,存储类型相同的元素集合,适合读不适合写注意:Python里可以存储不同类型的元素,但刷题时都是按照相同元素去做的相同元素占用存储的空间大小是一样的,下一个元素的位置就确定了数组时间......
  • 二分找最小绝对值
    Klee'sSUPERDUPERLARGEArray!!!每次测试时间限制:2秒每次测试的内存限制:256MB题目描述Klee拥有一个长度为n的数组a,数组中的元素依次为[k,k+1,...,k+n-1]。Klee希望选择一个索引i(1≤i≤n),使得x=|a1+a2+⋯+ai-ai+1-⋯-an|最小。其中对于任意......
  • UNR #8 Day2 难度查找 个人记录
    个人记录,可能存在一些错误或者问题。好题。这题和元旦激光炮有一点像,都是考虑根据给定的矩阵大小关系,在不确定某个位置具体值的情况下,把一定大于/小于答案的位置挖掉。但是本题可以说是拓展了,因为它在确定的时候也递归成了一个子问题。我们要找某个\(n\timesm\)矩阵(满足从......
  • 整数二分查找 leetcode35. 搜索插入位置 leetcode704. 二分查找
    这两道题的本质是一样的,都是整数二分查找。题目给出的条件比较强,序列是严格单调递增的。但是我这个即使序列存在重复的元素也可以满足需求35.搜索插入位置classSolution{public:intsearchInsert(vector<int>&nums,inttarget){intsize=nums.size();......