#69. x 的平方根
难度:简单 2020/5/9 每日一题打卡
题目描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200410195038979.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hoMTU1NzE1,size_16,color_FFFFFF,t_70)
解题思路
没仔细看题目之前以为是要算出来平方根,结果居然只要求证书部分,那感觉难度降低了好多。
1、偷懒大法
保护脑细胞,轻轻松松AC一道题
public int mySqrt(int x) {
return (int) Math.sqrt(x);
}
提交结果:
2、暴力法
实在是太暴力了,不推荐
public int mySqrt(int x) {
if(x == 1)
return 1;
for (int i = 1; i <= x/2+1; i++) {
if(i > x/i) //避免溢出
return i-1;
}
return 0;
}
提交结果:
3、二分法提高效率
public int mySqrt(int x) {
if(x < 2)
return x;
int p = 2,q = x/2,mid = 0;
while(p <= q) {
mid = (p+q)/2;
if(mid < x/mid) {
p = mid+1;
}else if(mid > x/mid) {
q = mid-1;
}else {
return mid;
}
}
return p<q?p:q;
}
提交结果:
4、牛顿法(高级)
public static int mySqrt(int x) {
if(x < 2)
return x;
double x0 = x;
double x1 = (x0 +x/x0)/2.0;
while(Math.abs(x0-x1) >= 1) {
x0 = x1;
x1 = (x0 +x/x0)/2.0;
}
return (int)x1;
}
提交结果:
5、袖珍计算器法(新知识点)
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;
return (long)right * right > x ? left : right;
}
提交结果: