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是当前根的位置。