二分查找左右边界写法
写法1:在闭区间内查找,如果没有则返回-1。结束条件是l<=r。
示例:在下列数组中查找>=27的第一个数的下标(27的左边界)。
#include<bits/stdc++.h>
using namespace std;
int arr[9]={0,3,6,6,7,9,13,17,27};
int search(int x){int l=1,r=8,m=0;int ans=-1;while(l<=r){m=(l+r)/2;if(arr[m]>=x) ans=m,r=m-1;else l=m+1;}return ans;
}
int main(){cout<<search(27);return 0;
}
示例:在下列数组中查找<=6的最后一个数的下标(6的有边界)。
#include<bits/stdc++.h>
using namespace std;
int arr[9]={0,3,6,6,7,9,13,17,27};
int search(int x){int l=1,r=8,m=0;int ans=-1;while(l<=r){m=(l+r)/2;if(arr[m]<=x) ans=m,l=m+1;else r=m-1;}return ans;
}
int main(){cout<<search(6);return 0;
}
写法2:在开区间内查找,结束条件是l+1<r
借一下董晓老师的图: