查找数字所在的位置
作者:互联网
又是被迫营业。
这道题目很简单但我错了
二分模板题.
1 int l = -1,r =N; 2 while(l+1!=r) 3 { 4 m=(l+r)>>1; 5 if(check(m)) l=m; 6 else r=m; 7 } 8 return l or r;
这个模板有几亿个细节值得注意:
1.l 与 r的初值在有效区间外,为了防止整个区间都满足或都不满足 check 函数
2.L = m,r = m。这里经常有人写成l=m+1或r=m-1 但这里为了不会产生边界问题与容易记忆就写成L=m,r=m。
3.l 表示check函数满足的边界,如都不满足check函数就为-1,r表示不满足check函数的边界,如都满足check函数就为n。
程序:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,a[1000000+10]={0}; 4 int main() 5 { 6 scanf("%d%d",&n,&m); 7 for(int i=1;i<=n;i++) 8 { 9 scanf("%d",&a[i]); 10 } 11 while(m--) 12 { 13 int k; 14 scanf("%d",&k); 15 int r=n+1,l=0; 16 while(l+1!=r) 17 { 18 int mid=(l+r)/2; 19 if(a[mid]>=k) 20 { 21 r=mid; 22 } 23 else if(a[mid]<k) 24 { 25 l=mid; 26 } 27 } 28 if(a[r]==k) printf("%d\n",r-1); 29 else printf("%d\n",-1); 30 } 31 return 0; 32 }
标签:数字,int,所在,mid,else,满足,查找,check,函数 来源: https://www.cnblogs.com/wjk53233/p/16183832.html