1.二分查找
通过每次查询,来缩小查寻范围,O(log n)的在有序序列里查询一个数的位置。
while(l<=r){ int mid=(l+r)>>1; if(a[mid]==ans){ cnt=mid; break; } else if(a[mid]>ans) r=mid-1; else l=mid+1; }
2.二分答案
若题目的答案具有单调性,及i成立i+1一定成立,或求最大值最小/最小值最大,考虑二分答案。
二分答案可将搜索答案转化为验证答案是否成立
while(l<=r){ int mid=(l+r)>>1; if(check(mid)){ ans=mid; r=mid-1; } else l=mid+1; }
check ——> 因题而定