题干
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
想法
直接去除小数部分,有暴力法,二分法,牛顿迭代法几种办法。
看到网上有直接用Math.sqrt的,我就只是想说你辣是真的牛批,可以直接调用Math类我还做个🔨
Java 代码
暴力
class Solution {
public int mySqrt(int x) {
int i;
for(i=0;i<=x;i++){
if(i*i>x||i*i<0){//防止溢出,超过整数的最大值
break;
}
}
return i-1;
}
}
二分法
public int mySqrt(int x) {
if(x <= 1)
return x;
int left = 1,right = x;
while(left <= right){
int mid = left + (right -left) / 2;
int sqrt = x / mid;
if(sqrt == mid)
return mid;
else if(sqrt < mid)
right = mid - 1;
else
left = mid + 1;
}
return right;
}
class Solution {
public int mySqrt(int x) {
long left = 0;
long right = Integer.MAX_VALUE;
while(left<right){
long mid = (left + right + 1)>>>1; //>>>为无符号右移
long square = mid*mid;
if(square>x){
right = mid-1;
}else{
left = mid;
}
}
return (int) left;
}
}
牛顿迭代法
这是数值分析的内容,具体的解析不熟悉的可以参考
https://blog.csdn.net/weixin_42130471/article/details/82730562
代码:
class Solution {//牛顿迭代法,f(x)=x^2-t
public int mySqrt(int x) {
double t=(double)x;//(double)可以省
double x0=x;
x0=x0/2+t/(2*x0);
while(Math.abs(x0*x0-t)>0.00001)
x0=x0/2+t/(2*x0);
return (int)x0;//double 转int类型必须使用强制类型转化
}
}
或者:
public int mySqrt(int x) {
long r = x;
while (r*r > x)
r = (r + x / r) / 2;
return (int) r;
}
思路代码参考:https://blog.csdn.net/weixin_42130471/article/details/82730562