Java:
/* The isBadVersion API is defined in the parent class VersionControl.
boolean isBadVersion(int version); */
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int low=1,high=n;
while(low<=high){
if(n==1){return 1;}
int mid=low+(high-low)/2;
if(isBadVersion(mid)){
high=mid;
}
else{
low=mid+1;
}
if(low==high){return high;}
}
return high+1;
}
}
写成mid=(low+high)/2会越界,而写成mid=low+(high-low)/2不会越界的原因:
int 取值范围
java语言中int的取值范围为:-2147483648 ~ 2147483647解释如下:int类型在java语言中占4个字节,即32个二进制位。当表示正数时,最高位为符号位(符号位为0),最大的正数是 0111 1111 1111 1111 1111 1111 1111 1111 即2^31 -1 = 2147483647当表示负数时,最高位为符号位(符号位为1),最小的负数是 1000 0000 0000 0000 0000 0000 0000 0000 而在计算机中是以补码的形式存储的,java语言规定 1000 0000 0000 0000 0000 0000 0000 0000 的补码为-2147483648所以java语言中int的取值范围为:-2147483648~2147483647
假设入参的最大值为max = 2^31 -1
1、int mid = (left + right) /2;
2、int mid = left + (right - left) / 2;
1式执行代码的时候,假设要找的值时max/2 的右边时,会出现
int mid = (left + right) /2 = (max + max /2)/2 的情况。
因为max + max /2是恒大于max的,所以出现溢出
2式执行代码的时候,假设要找的值时max/2 的右边时,会出现
int mid = left + (right - left) / 2 = (max - max/2)/2的情况
因为max - max/2 是恒小于 max 的,所以不会出现溢出问题。