Day5 Sqrt(x)

LeetCode69: Sqrt(x);


Implement int sqrt(int x).

Compute and return the square root of x.

x is guaranteed to be a non-negative integer.


Example 1:

Input: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated.


意思是求一个非负整数x的算术平方根,答案向下取整。

比较直接的想法就是,从1开始往上加,求其平方刚好等于或大于x就可以了,虽然暴力,但是说得通。然而是行不通的,因为一个较大的值平方后更大了,可能会越界(亲身体验。所以为了防止越界和出现奇怪的值,可以改用除法,每次用x除以目标乘数,倘若这个值比目标乘数大,说明这个目标乘数还不够大,增加它,继续判断。


为了稍微节省一点时间,我的第一种蠢办法是算出这个数是几位数,比如我们知道4位数的数的平方根一定是两位数,所以从最小的两位数开始,前面的所有数是不必要再去看的,就从这里逐渐增加乘数然后比较就好了。



这样还是不够快,因为这样节省的时间其实并不多,以2147483647为例,正确答案应该为46340,原始的办法就是加46340次,上述办法加了46340-10000=36340次,也没好多少。


再改进一下,就是二分式查找,时间性能在O(logn)中。

还有一种更快一些的是使用数学上的牛顿迭代法:迭代求下一个根的位置的公式r=(r+x/r)/2;r是当前根的位置。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值