二分的本质是边界 对于整数二分与浮点数二分有不同的模板
数组里的查找
整数二分(单个)
[整数二分] [c++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| int bsearch_one(int l,int r) { while(l<r) { int mid=(l+r)/2; if(q[mid]==goal) return mid; else if(q[mid]>goal) r=mid; else l=mid+1; } return -1; } 寻找左分界点 int bsearch_one(int l,int r) { while(l<r) { int mid=(l+r)/2; if(q[mid]>=goal) r=mid; //右边端点不断靠左边移动 else l=mid+1; } if(q[l]!=goal) return -1; return l; } 寻找右分界点 int bsearch_one(int l,int r) { while(l<r) { int mid=(l+r+1)/2; if(q[mid]<=goal) l=mid; //右边端点不断靠左边移动 else r=mid-1; } if(q[l]!=goal) return -1; return l; } 若不存在对应数 l是找的最近的满足check的索引
|
浮点数二分 因为没有整除 所以有严格边界
[浮点数二分(例题三次方根)] [c++]1 2 3 4 5 6 7 8 9 10 11 12
| double x; cin>>x; double l=0,r=x; while(r-l>1e-8)//精度尽量大 { double mid=(l+r)/2; if(mid*mid>=x){ r=mid; }else{ l=mid;//不用考虑边界 } }
|
总之浮点数二分简单多了~