题目:
分析:
这是道简单题,但我们对他却有多种不同的解法
1.正面硬刚
计算器在计算 sqrt(s)的时候所采用的方法是这样的
所以我们可以直接用右边的式子进行计算
class Solution {
public int mySqrt(int x) {
if (x < 2) return x;
int left = (int)Math.pow(Math.E, 0.5 * Math.log(x));
int right = left + 1;
//right*right有可能超出int范围
return (long)right * right > x ? left : right;
}
}
结果:
2.二分查找法
这道题的本质和从一个有序数组中查找某一个数的原理其实类似
所以二分查找法也是行得通的
class Solution {
public int mySqrt(int x) {
if (x < 2) return x;
long num;
int pivot, left = 2, right = x / 2;
while (left <= right) {
pivot = left + (right - left) / 2;
num = (long)pivot * pivot;
if (num > x) right = pivot - 1;
else if (num < x) left = pivot + 1;
else return pivot;
}
return right;
}
}
结果: