69. x 的平方根
这题是个简单题,而且蛮力也可以解,就特殊数据涉及边界情况处理一下就好。算半个水题。
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
测试样例-我给多几组(基本这些都对就没问题了)
测试输入:
4
8
3
2147483647
10
0
1
测试输出:
2
2
1
46340
3
0
1
蛮力法:击败13% 汗颜
思路:直接从1到x/2+1遍历查找 找到就break
class Solution {
public:
int mySqrt(int x) {
long long res=1;
for(long long i=1;i<=x/2+1;i++)
{
long long temp=i*i;
if(temp==x||temp>x)
{
res=i;break;
}
}
if(res*res==x) return res;
return res-1;
}
};
二分法:双百
思路:二分查找,但是要处理0 1输入和返回条件的设置
譬如输入8 初始 下界=1 上界=5 中值=3
下界 | 上界 | 中值 | 中值平方 |
---|---|---|---|
1 | 5 | 3 | 9(大于) |
1 | 3 | 2 | 4(小于) |
2 | 3 | 2 | 4(死循环) |
所以考虑 当上界=下界+1时 return下界避免死循环
class Solution {
public:
int getnum(int l,int r,int x)
{
if(r==l+1) return l; //注意
long long mid=(l+r)/2;
long long temp=mid*mid;
if(temp>x) return getnum(l,mid,x);
if(temp<x) return getnum(mid,r,x);
return mid;
}
int mySqrt(int x) {
if(x==0) return 0;
int res=getnum(1,x/2+1,x);
return res;
}
};