二分:通过不断取中点,重复将一个区域一份为二,使其不断缩小范围直至找到答案
本质:性质/边界,而不是单调性
时间复杂度:O(logN)
代码模版:
//找到的是最左侧的数值点
while(l < r){ //尽可能的往左找int mid = l+r >> 1; //向下取整if(q[mid] >= x) r=mid;else l = mid + 1;
}
//查找的是最右侧的数值点
while(l<r){ //尽可能的往右找int mid = l+r+1 >> 1; //向上取整if(q[mid] <= x) l=mid;else r = mid-1;
}
例题一:AcWing 802. 区间和
例题二:AcWing 790. 数的三次方根