AI摘要:二分查找中,使用(left+right)/2计算中间值可能导致整数溢出,当left和right都很大时,其和可能超出int范围。应改用left + (right - left)/2来避免溢出问题。
Powered by AISummary.
刚刚在刷力扣时,刷到了一个简单地二分查找问题。
但当我提交时发现,超出了时间限制。
经过检查发现是中值出现了问题,mid = (left+right)/2;
若使用(left+right)/2,因为java中int数据类型是32位的,数值超过32位就会被反转。eg:2147483647+1 = -2147483648。
所以,我们不应使用此方法。而是应该使用left + (right - left)/2 <= right
因为根据定义得left < right
所以,right - left > 0且 <= right。并且left + (right - left) = right
因此,left + (right - left)/2 <= right;
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is higher than the picked number
* 1 if num is lower than the picked number
* otherwise return 0
* int guess(int num);
*/
//二分查找
public class Solution extends GuessGame {
public int guessNumber(int n) {
int left = 1;
int right = n;
while(left <= right){
int mid = left + (right - left)/2 <= right;
//int mid = (left+right)/2;
int result = guess(mid);
if(result == 0){
return mid;
}
else if(result == -1){
right = mid - 1;
}
else if(result == 1){
left = mid + 1;
}
}
return -1;
}
}
IhaveBB