二分的一些总结(6个二分答案+1个二分查找)

二分答案

1 int l=0,r=1e9;
2     while (l<=r){
3         int mid=l+r>>1;
4         if (check(mid)) l=mid+1,ans=mid;
5             else r=mid-1;
6     }

查找=x的第一个数的下标

1 int look(int l,int x){
2     int ans=0,r=n;
3     while(l<=r){
4         int mid=l+r>>1;
5         if(a[mid]<x) l=mid+1;
6         else ans=mid,r=mid-1;
7     }
8     return ans;
9 }

查找=x的最后一个数的下标

1 int look(int l,int x){
2     int ans=0,r=n;
3     while(l<=r){
4         int mid=l+r>>1;
5         if(a[mid]<=x) ans=mid,l=mid+1;
6         else r=mid-1;
7     }
8     return ans;
9 }

查找小于x的最后一个数的下标

1 int look(int l,int x){
2     int ans=0,r=n;
3     while(l<=r){
4         int mid=l+r>>1;
5         if(a[mid]<x) ans=mid,l=mid+1;
6         else r=mid-1;
7     }
8     return ans;
9 }

查找大于x的最先一个数的下标

1 int look(int l,int x){
2     int ans=0,r=n;
3     while(l<=r){
4         int mid=l+r>>1;
5         if(a[mid]>x) ans=mid,r=mid-1;
6         else l=mid+1;
7     }
8     return ans;
9 }

查找大于等于x的最先一个数的下标

1 int look(int l,int x){
2     int ans=0,r=n;
3     while(l<=r){
4         int mid=l+r>>1;
5         if(a[mid]>=x) ans=mid,r=mid-1;
6         else l=mid+1;
7     }
8     return ans;
9 }

查找小于等于x的最后一个数的下标

1 int look(int l,int x){
2     int ans=0,r=n;
3     while(l<=r){
4         int mid=l+r>>1;
5         if(a[mid]<=x) ans=mid,l=mid+1;
6         else r=mid-1;
7     }
8     return ans;
9 }
扫描二维码关注公众号,回复: 4248187 查看本文章

猜你喜欢

转载自www.cnblogs.com/zhouykblog/p/10023731.html