原题:
Implement int sqrt(int x)
.
Compute and return the square root of x.
» Solve this problem
方法:
两分法。原因就是:要求x的平方根,在假定x为正整数的情况下,那么它的结果一定在0到x之间,而二分查找法一定不会漏掉。
以此为基础,每一次取中间值的平方作为和x的比较,如果太大,那么结果一定在左半部分,如果太小,那么结果一定在右半部分。
代码:
public class Solution {
public int sqrt(int x) {
// Start typing your Java solution below
// DO NOT write main() function
long low = 0, high = x;
long mid;
while(low <= high){
mid = (low+high)/2;
if(mid*mid == x) return (int)mid;
else if(mid*mid < x) low = mid+1;
else high = mid-1;
}
mid = (low+high)/2;
return (int)mid;
}
}
P.S.牛逼哄哄的牛顿迭代法
public class Solution {
public int sqrt(int x) {
double x0 = x / 2.0;
double x1 = (x0 + x / x0) / 2.0;
while (Math.abs(x1 - x0) > 0.00001) {
x0 = x1;
x1 = (x0 + x / x0) / 2.0;
}
return (int) x1;
}
}
小结:
难以想象求平方根竟然和二分查找联系了起来,无语了我。第二个解法是数学方法,非常牛逼,我没有研究透彻。