实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
解题思路
1)使用二分查找,通过不断的缩小范围来查找符合的答案
二分法使用条件:1有序,2存在上下界,能过通过索引访问。
mid = left + (right - left)/2;//防止溢出,等于mid = (left + right)/ 2.
if(x == 0 || x == 1)
return x;
int left = 1;
int right = x;
int result = 0;
while(left <= right){
int mid = left + (right - left)/2;
if(mid == x / mid)
return mid;
else if(mid > x / mid){
right = mid - 1;
}else{
left = mid + 1;
result = mid;//最后都是加left加1,然后变成left > right
}
}
return result;
2)牛顿迭代法
/*
故要求解sqrt(x),即求解sqrt(t)(t=x),
即求函数f(x)=x2−t=0f(x)=x2−t=0的解,
我们给初始解赋一个初始值x0x0, 那么我们在点(x0,f(x0))(x0,f(x0))处对曲线作切线, 得到如下方程y−f(x0)=f(x0)′(x−x0)y−f(x0)=f(x0)′(x−x0),令y=0, 解得x=x0/2+t/(2x0)x=x0/2+t/(2x0),
则迭代的解x1=x0/2+t/(2x0)x1=x0/2+t/(2x0),
像这样依次迭代xn=xn−1/2+t/(2xn−1)xn=xn−1/2+t/(2xn−1),
若f(xn)f(xn)很接近于0(与0的差绝对值小于某个阈值),这迭代终止,xnxn即为函数的解
*/
class Solution {
public int mySqrt(int x) {
if(x == 0 || x== 1){
return x;
}
double x0 = (double)x;
double t = x;
while(Math.abs(x0*x0-t) > 0.1){
x0 = x0/2.0+t/(2.0*x0);
}
return (int)x0;
}
}