原题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述:
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
思路:
思路一:从1开始遍历,直到找到那个临界值i,使得i*i<=x且(i+1)*(i+1)>x,那么此时这个i就是x怕平方根的整数部分。
主要代码:
int i=1;
while ((x/i)>=i)//注意别写成i*i<=x,否则可能超过int的范围报错。
{
i++;
}
return i-1;
结果这样复杂度为O(x^0.5)的朴素算法才击败了个位数的用户。
思路二:
通过二分夹逼法,设置三个参数:left、middle、right,动态调整范围,将i找到。
代码实现(二分法):
int mySqrt(int x){
if(x==0)return 0;
if(x==1)return 1;//偷懒把x==1的情况排除一下,否则条件会判断错误。
int left=1;
int right=x;
int i;
for(i=right/2;left<right;i=(left+right)/2)
{
if((x/i)<i)
{
right=i-1;
}
else if((x/i)>i)
{
left=i+1;
}
else return i;
}
if((i*i)>x)
{
return i-1;
}
else return i;
}
时间复杂度:
显然,时间复杂度为O(logx);