二分法(摸索的坑)
最近发现二分法做题时候经常出现错误,总是在细节方面做得不是很好,一直出错,总是wrong answer。决定总结一下二分法。
-
防止溢出
取中位数时候要防止在运算过程中出现溢出情况。
例如说:int的取值范围为(-2147483648\——2147483647),占用4个字节(-2~31 \——2^31 -1)。你要在100——2^31-1之间用二分法进行查找。
int mid =(left+right)/2;
这样的话(left+right)>2^31-1 ,会在运算中溢出,从而使答案错误。
(r-l) / 2+l; -
边界条件的判断
while(condition) 中condition的具体表达形式,是left<right,还是left<=right;
要结合题目具体信息来进行判断。
if(condition) 的condition也要根据题目信息来判断是否包含“=”选项。 -
验证(一定要做)
判断只剩下两个值的时候,要取的值在left和right的结果是否题目预想的一样。然后进行测试提交
常见两种:
一:
while (l < r) {
int mid = (r-l) / 2+l;
if (condition)
l = mid + 1;
else
r = mid;
}
二:
while (l <= r) {
int mid = (r-l) / 2+l;
if (condition)
return mid;
else if (condition)
l = mid + 1;
else
r = mid - 1;
}