总集篇连接:小白学算法
二分
简介:二分算法是一种根据序列的某种性质(例如单调性),每次将答案区间减半,最后找到答案或者答案所在的区间的不断逼近的过程。这种算法的时间复杂度为O(logn)。
代码实现:
// 查找数是否存在于数组 存在则返回true 否则则返回false
bool find(int num){
int l=0,r=a.size()-1;
while(l<=r){
int mid=l+r>>1;
if(mid==num)return true;
else if(mid<num)l=mid+1;
else r=mid-1;
}
return false;
}
二分进阶
考虑一种情况,让你输出符合条件的最左边的数,或者是最右边的数,这是上述二分就不能很好的完成任务。
查询左端点,代码实现:
// 如果存在符合条件的左端点则返回左端点位置 否则返回-1
int findStart(int ans, int l, int r){
int mid;
while(l<=r){
mid=l+r>>1;
if(a[mid]<ans){
l=mid+1;
}
//使得找的数在范围左端点
else if(a[mid]>=ans){
r=mid-1;
}
}
return a[l]==ans?l:-1;
}
查询右端点,代码实现:
// 如果存在符合条件的右端点则返回右端点位置 否则返回-1
int findEnd(int ans, int l, int r){
int mid;
while(l<=r){
mid=l+r>>1;
//使得找的数在范围右端点
if(a[mid]<=ans){
l=mid+1;
}else if(a[mid]>ans){
r=mid-1;
}
}
return a[r]==ans?r:-1;
}