69. x 的平方根
给你一个非负整数
x
,计算并返回 x
的 平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如
pow(x, 0.5)
或者 x ** 0.5
。示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 2
31
- 1
二分法
思路
注意最后返回的值是较小的,比如x=8,应该返回2.
题解
class Solution: def mySqrt(self, x: int) -> int: left, right = 0, x while left <= right: mid = left + (right -left) // 2 temp = mid * mid if temp == x: return mid elif temp < x: left = mid + 1 elif temp > x: right = mid - 1 return right
模板二分
思路
套模板的二分法,最后为了取整采用了特殊技巧!
题解
import math class Solution: def mySqrt(self, x: int) -> int: if x <= 1: return x t = x def f(x): return x * x - t def binary_method(l, r): epison = 10 ** (-6) error = abs(f(l)) while error > epison: m = l + (r - l) / 2 if f(m) * f(l) < 0: r = m else: l = m error = abs(f(l)) return l res = binary_method(0, t) # 属于是技巧了! if int(res + 0.00001) == int(res): return int(res) else: return int(res + 1)
牛顿法
思路
套模板即可
题解
class Solution: def mySqrt(self, x: int) -> int: t = x def f(x): return x * x - t def df(x): return 2 * x epison = 10 ** (-4) x_0 = t while f(x_0) > epison: x_1 = x_0 - f(x_0) / df(x_0) x_0 = x_1 return int(x_0)