Leetcode二分查找4:69. x 的平方根

链接:https://leetcode-cn.com/problems/sqrtx/https://leetcode-cn.com/problems/sqrtx/

该题目让我们不用库函数sqrt(x),来求x的平方根。

方法一:数学计算

公式变形:sqrt(x)==x^{1/2}==e^{lnx^{1/2}},则用lnx函数和exp函数即可求解。

时间复杂度:O(1);

空间复杂度:O(1);

 由于计算机无法存储浮点数的精确值,而指数函数和对数函数的参数和返回值均为浮点数,因此运算过程中会存在误差。例如当 x = 2147395600,这样在对结果取整数部分时,得出4633946339 这个错误的结果。所以得多加一步,判断ans和ans+1哪个是真正的答案。

class Solution {
public:
    int mySqrt(int x) {
		if(x==0){
			return 0;
		}
		int ans=exp(0.5*log(x));
		return (long long)((ans+1)*(ans+1)<=x?ans+1:ans);
    }
};

方法二:二分查找

时间复杂度:O(logx),x为二分查找的次数。

空间复杂度:O(1)。

class Solution {
public:
    int mySqrt(int x) {
		int l=0,r=x,ans=-1;
		while(l<=r){
			int mid=(r-l)/2+l;
			if((long long)mid*mid<=x){
				ans=mid;
				l=mid+1;
			}
			else{
				r=mid-1;
			} 	
		}
		return ans;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华梦天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值