-
查找边界
-
单调性
例:查找 “00001111111”为例,分别查找‘0’和‘1’的边界
- 查找最右端‘0’的位置
#include<iostream> #include<string> using namespace std; int check(int l, int r,string s){ int mid; while(r>l){ mid=(l+r+1)>>1; //这里+1上取整为了防止死循环 if(s[mid]=='0') l=mid; else r=mid-1; } return r; } int main(){ string s; cin>>s; int l=0,r=s.length()-1; cout<<check(l,r,s)<<endl; }
y总的模板①:
int bsearch_1(int l, int r){ while(l<r){ int mid=l+r+1>>1; if(check(mid)) l=mid; else r=mid-1; } return l; }
2.查找最左端的'1';
#include<iostream>
#include<string>
using namespace std;
int check(int l, int r,string s){
int mid;
while(r>l){
mid=(l+r)>>1;
if(s[mid]=='1') r=mid;
else l=mid+1;
}
return r;
}
int main(){
string s;
cin>>s;
int l=0,r=s.length()-1;
cout<<check(l,r,s)<<endl;
}
y总的模板②
int bsearch_2(int l, int r){
while(l<r){
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
return l;
}