標籤:
先看二分尋找的一般寫法
#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<vector>using namespace std;#define N 100005#define ll __int64int n,a[N];int findd(int x) { int l=0,r=n-1; while(l<=r) { int mid=(l+r)>>1; if(a[mid]==x) return mid; if(a[mid]>x) r=mid-1; else l=mid+1; } return -1; //沒有找到}int main(){ int i,m,x,t; while(~scanf("%d",&n)) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); scanf("%d",&m); while(m--) { scanf("%d",&x); t=findd(x); printf("%d\n",t); } } return 0;}
一般的二分尋找只能找到目標值,但是當目標值重複出現時返回的下標就不確定,下面的寫法可以返回最先出現的目標值的下標。當目標值未出現時,返回比目標值大的那個元素的下標或者返回邊界值n;
#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<vector>using namespace std;#define N 100005#define ll __int64int n,a[N];int findd(int x){ int l=0,r=n-1; while(l<=r) { int mid=(l+r)>>1; if(a[mid]>=x) r=mid-1; else l=mid+1; /*if(a[mid]<x) //這種寫法也上面同樣效果 l=mid+1; else r=mid-1;*/ } return l; //返回目標值的下標,若有多個值相同,返回最先出現的下標。}int main(){ int i,m,x,t; while(~scanf("%d",&n)) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); scanf("%d",&m); while(m--) { scanf("%d",&x); t=findd(x); printf("%d\n",t); } } return 0;}
二分尋找小結