目录

0069:x 的平方根

力扣第 69 题

题目

给你一个非负整数 x ,计算并返回 x算术平方根

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 231 - 1

相似问题:

分析

  • 就是求满足 y * y <= x 的最大整数 y
  • y * y 单调递增,因此可以用二分查找

解答

1
2
3
class Solution:
    def mySqrt(self, x: int) -> int:
        return bisect_left(range(x+1),True,key=lambda y:y*y>x)-1

39 ms

*附加

  • 还可以用牛顿迭代法
  • 每一步逼近的表达式为 x(n+1)=x(n)-f(x)/f’(x)
  • 对于本题,迭代 $y=(y+x/y)/2$ 即可不断逼近 $\sqrt x$
  • y 取整得到 y’,若 y‘<=$\sqrt x$,y‘ 即是所求
1
2
3
4
5
6
class Solution:
    def mySqrt(self, x: int) -> int:
        y = x
        while y*y>x:
            y = (y+x//y)//2
        return y

48 ms