1 问题
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
2 答案
这题直接不会
官方解,实际上是一道搜索题
- 库函数,最简单的可以用math库
class Solution(object):def mySqrt(self, x):return int(math.sqrt(x))
- 暴力
class Solution(object):def mySqrt(self, x):sqrt = 1while sqrt * sqrt <= x:sqrt += 1return sqrt - 1
- 蓝红二分搜索法,该法模板见
https://blog.csdn.net/CSDNLHCC/article/details/133893219?spm=1001.2014.3001.5501
class Solution(object):def mySqrt(self, x):l = -1r = x + 1while l + 1 < r: # 注意 这里是 l + 1 < rmid = l + (r-l)//2if mid ** 2 <= x: # 这里小于等于,然后返回 r-1 即可 l = midelse:r = midreturn r - 1
- 牛顿法
设num为输入,x为所求
问题转化为求f(x)=num - x ^ 2
的零点,
牛顿法递推公式Xn+1 = Xn - f(Xn)/f'(Xn)
带入f'(x) = -2x
得:Xn+1 = Xn +(num - Xn ^ 2)/2Xn = (num + Xn ^ 2) / 2Xn = (num / Xn + Xn) / 2
class Solution:def mySqrt(self, num: int) -> int:x = numwhile x*x > num:x = (num // x + x) // 2 # 据说用整除可以提高效率return x
https://leetcode.cn/problems/sqrtx/solutions/238682/jing-dian-ti-mu-yi-ti-duo-jie-si-chong-fang-fa-jie/