来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
(1)投机取巧
class Solution:
def mySqrt(self, x: int) -> int:
# return int(x ** 0.5)
# return int(pow(x,0.5))
import math
return int(math.sqrt(x))
(2)袖珍计算器算法
链接:https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
ans = int(math.exp(0.5 * math.log(x)))
return ans + 1 if (ans + 1) ** 2 <= x else ans
(3)二分查找
找k^2<=x的最大值
class Solution:
def mySqrt(self, x: int) -> int:
left = 0
right = x
res = -1
while left <= right: # 二分查找 这里是小于等于 ,小于不行
mid = (left + right) // 2 # //整除(向下取整) #二分查找,mid写在循环中
if mid ** 2 <= x: # 当前值小,说明在右边,left=mid+1
res = mid
left = mid + 1
else:
right = mid - 1
return res
(4)牛顿迭代
链接:https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/