实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
解法一:使用二分查找法,对中间数进行判断,如果mid^2 <= x 且 (mid+1)^2>x,则说明int(mid)即为所求
在Python3中 * 代表乘法,** 代表乘方
解法二:
算法:牛顿迭代法(详细解释可自行查询)。
在这简单介绍一下:
求一个值 a 的平方根,那么首先令 x = a,然后不断令 x = (x + a/x)/2,这样迭代几次之后得到的数值就趋近于准确值了。
以下是Java版本:
题意:算一个数的平方根。
注意点就是:取中值相乘,有可能会超过整数的最大范围,所以比较的时候就会出错。所以在定义的时候全部定义为long型。
这道题很巧妙的运用了二分查找法的特性,有序,查找pos(在这道题中pos=value),找到返回pos,找不到返回邻近值。
因为是求数x(x>=0) 的平方根, 因此,结果一定是小于等于x且大于等于0,所以用二分查找法肯定能搜到结果。
以每一次的mid的平方来与target既数x相比:
如果mid*mid == x,返回mid;
如果mid*mid < x,那么说明mid过小,应让low = mid+1,在右边继续查找
如果mid*mid > x,那么说明mid过大,应让high = mid-1,在左边继续查找
若x无法开整数根号(在上述查找中没有找到),那么我们仍然可以利用之前对二分查找法总结的技巧,当target值不在数组中,low指向大于target的那个值,high指向小于target的那个值,由于我们需要向下取整的结果,所以我们返回high指向的值(这里high指向的值和high的值是同一个值),这个值就是所求得最接近起开根号结果的整数值。
因为leetcode的test case x=2147395599,在算mid*mid的时候造成溢出,所以mid不能使用int型来接,要使用long型防止溢出(Java中Integer型的范围:-2147483648 到2147483648)