原题链接
二分查找的前提:
- 目标函数单调性(单调递增或者递减)
- 存在上下界
- 能够通过索引访问
方法1:二分法
首先计算一个公式:(x / 2 + 1)2 = x2 / 4 + x + 1 一定是 > x 的,所以当 x 是大于 1 的整数时,它的平方根一定在 1 到 (x / 2 + 1)之间
public int mySqrt(int x) {
//二分法:
if (x == 1 || x == 0) return x;
int start = 1;
int end = x / 2 + 1; //最终结果一定是在 start 和 end 之间
int mid = 0;
while (start <= end) {
mid = start + (end - start) / 2;//防止整型溢出
//满足这个条件的就是 x 的 int型平方根了,而且一定存在
if (mid <= x / mid && (mid + 1) > x / (mid + 1)) return mid;
if (mid > x / mid) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return 99999;//最后这个随便return
}
方法2:牛顿迭代法
详细题解
没听过这个方法的人很难想出来,可以作为额外知识点了解
//方法2:牛顿迭代法 80% 79%
public int mySqrt(int x) {
long r = x;
while(r * r > x) { //循环结束时,说明 r * r 第一次 <= x,也就是最终结果
r = (r + x / r) / 2;
}
return (int)r;
}