简要思路;
单调数列查找,用二分的思路。
但是注意当某个数在一个有序数列里面重复出现的话,(13335)查找333最左边3的位置和最右边3的位置代码不一样
左边的话=要和>写在一起 表示"不允许任何小于等于x的存在"
反之=和<写一起
ps 实际上二分的本质特征并不是数列的单调性:
而是某个界左边必然更小,右边必然更大(某个界的左右必然分别满足两个性质)
思路理清了 本大爷要发代码啦!!!!!!
代码:
#include <iostream>
using namespace std;
const int N=1e6+10;
int n,m;
int a[N];
int dichotomy(int l, int r, int x){
while(l<r){
int mid=(l+r)/2;
if(a[mid]>=x) r = mid;//在x的右边//保证最后mid是靠左边的那个纸 主要是不允许左边任何小于等于的存在
else l = mid+1;
}
if(a[l]==x)return l+1;
else return -1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
while(m--){
int h;
scanf("%d",&h);
printf("%d ",dichotomy(0,n-1,h));
}
return 0;
}