二分法查找
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,tar;
while(scanf("%d",&n)!=EOF){
scanf("%d",&tar);
int ch[n],i;
for(int i=0;i<n;i++){
scanf("%d",&ch[i]);
}
int left=0,right=n-1,temp;
if(ch[left]==tar){
i=left;
while(ch[i]==tar&&i<n){
i++;
}
printf("[%d,%d]\n",left,i-1);
}
else if(ch[right]==tar){
i=right;
while(ch[i]==tar&&i>=0){
i--;
}
printf("[%d,%d]\n",i+1,right);
}
else if(n<=2){
printf("[-1,-1]\n");
}
/*begin:二分法查找target*/
else{
int flag=0;
while(right>left){
temp=(left+right)/2;
if(ch[temp]>tar){
right=temp;
}
else if(ch[temp]<tar){
left=temp;
}
else if(ch[temp]==tar){
flag=1;
break;
}
if(right-left==1){
break;
}
}
/*end:二分法查找target*/
if(flag==0){
printf("[-1,-1]\n");
}
else{
int l,r;
for(i=temp;i<right;i++){
if(ch[i]==tar){
r=i;
}
else{
break;
}
}
for(i=temp;i>left;i--){
if(ch[i]==tar){
l=i;
}
else{
break;
}
}
printf("[%d,%d]\n",l,r);
}
}
}
}

京公网安备 11010502036488号