问题:Sqrt(x)
Implement int sqrt(int x).
Compute and return the square root of x.
思路:1.暴力求解,从最小遍历到x/2,然后看哪个数的平方,等于目标的值。
2. 用二分查找法,寻找sqrtx的值。
用第二种方法的巧妙之处就在于,可以把原数x看成一个从0到x的数组,然后用二分法,查找数组里面的某个值,可以减少比较次数。。
代码:
public static int sqrt(int x) {
int low = 0;
int high = x;
while(low<=high){
long mid = (long)(low + high)/2;
if(mid*mid < x)
low = (int)mid + 1;
//注意这里一定要用else if ,不能直接另启用一个if,这样的话,当执行完上一个if后还要判断这个if语句,还要后面的else
else if(mid*mid > x)
high = (int)mid - 1;
else
return (int)mid;
}
return high;
}
注意 :因为leetcode的test case x=2147395599,在算mid*mid的时候造成溢出,所以mid不能使用int型来接,要使用long型防止溢出(Java中Integer型的范围:-2147483648 到2147483648)