二分查找是一种在有序数组中查找特定元素的算法。它的基本思想是将数组分成两部分,判断目标元素在哪一部分中,然后继续在该部分中进行查找,直到找到目标元素或者确定目标元素不存在为止。这种算法的时间复杂度为O(log n),比线性查找的时间复杂度O(n)更快。
例如,寻找n个从小到大顺序的中指定的数字位置,可以:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+10,inf = 0x3f3f3f3f; int a[N]; int n,m; void find(int x) { int l = 1,r = n; while(l<=r) { int mid = (l+r)/2; if(a[mid]==x) { cout<<mid<<endl; return ; } else if(a[mid]>x)l = mid+1; else r = mid-1; } cout<<"None"<<endl; return; } int main() { cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=m;i++) { int x;scanf("%d",&x); find(x); } return 0; }
3750: 二分查找
描述
将n个从小到大排序的整数(n<1000000)从1~n进行编号,并给出一个待查找的整数,请使用二分法进行查找。
输入
第一行为n(n<1000000)和m(m<100000),n表示序列中的元素个数,m表示查询次数。
第二行为n个从小到大排序的整数,以空格分隔;
接下来有m行,每行一个待查询的整数。
输出
对于每次查询,如果能够在序列中找到待查询的整数,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。
样例输入
10 2
1 2 4 5 6 7 8 9 10 11
10
12
样例输出
9
None
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+10,inf = 0x3f3f3f3f; int a[N]; int n,m; void find(int x) { int l = 1,r = n; while(l<=r) { int mid = (l+r)/2; if(a[mid]==x) { while(a[mid]==x)mid--; cout<<mid+1<<endl; return ; } else if(a[mid]>x)r = mid-1; else l = mid+1; } cout<<"None"<<endl; return; } int main() { cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=m;i++) { int x;scanf("%d",&x); find(x); } return 0; }
7379: 二分查找II
描述
将n个从大到小排序的整数(n<1000000)从1~n进行编号,并给出一个待查找的整数,请使用二分法进行查找。
输入
第一行为n(n<1000000)和m(m<100000),n表示序列中的元素个数,m表示查询次数。
第二行为n个从大到小排序的整数,以空格分隔;
接下来有m行,每行一个待查询的整数。
输出
对于每次查询,如果能够在序列中找到待查询的整数,则输出编号(如果存在多个编号,返回编号最大的),如果不存在,则输出None。
样例输入
10 2
11 10 9 8 7 6 5 4 2 1
10
12
样例输出
2
None
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+10,inf = 0x3f3f3f3f; int a[N]; int n,m; void find(int x) { int l = 1,r = n; while(l<=r) { int mid = (l+r)/2; if(a[mid]==x) { while(a[mid]==x)mid++; cout<<mid-1<<endl; return ; } else if(a[mid]>x)l = mid+1; else r = mid-1; } cout<<"None"<<endl; return; } int main() { cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=m;i++) { int x;scanf("%d",&x); find(x); } return 0; }View Code
标签:二分,10,int,mid,long,查找,整数 From: https://www.cnblogs.com/jyssh/p/17392252.html