【LeetCode】69. x 的平方根

1 问题

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

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

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

示例 1:

输入:x = 4
输出:2

示例 2:

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

2 答案

这题直接不会

官方解,实际上是一道搜索题

  1. 库函数,最简单的可以用math库
class Solution(object):
    def mySqrt(self, x):
        return int(math.sqrt(x))
  1. 暴力
class Solution(object):
    def mySqrt(self, x):
        sqrt = 1
        while sqrt * sqrt <= x:
            sqrt += 1
        return sqrt - 1

  1. 蓝红二分搜索法,该法模板见

https://blog.csdn.net/CSDNLHCC/article/details/133893219?spm=1001.2014.3001.5501

class Solution(object):
    def mySqrt(self, x):
        l = -1
        r = x + 1
        while l + 1 < r:  # 注意 这里是 l + 1 < r
            mid = l + (r-l)//2
            if mid ** 2 <= x:  # 这里小于等于,然后返回 r-1 即可 
                l = mid
            else:
                r = mid
        return r - 1
  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 = num
        while 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/

你可能感兴趣的:(LeetCode,Python,leetcode,算法)