69. x 的平方根

Difficulty
easy
Tags
二分查找
Star
给你一个非负整数 x ,计算并返回 x平方根
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5
示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
  • 0 <= x <= 231 - 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)