Leetcode 69:Sqrt(x)(超详细的解法!!!)

这篇博客详细解析了LeetCode 69题的解决方案,通过牛顿法寻找非负整数x的平方根。文章介绍了二分搜索法的不合适之处,并详细阐述了牛顿法的迭代公式,最后提供了问题的GitHub链接供读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。

解题思路

首先可以想到的最简单的处理思路就是遍历[1,x]的所有元素i,计算相应的平方值,如果大于x的话,我们返回i-1即可。

class Solution:
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        for i in range(x+1):
            if i**2 > x:
                return i - 1
        return x

但是这显然太过随意,时间复杂度太高。

对于数字查找这类问题,我们都可以使用二分搜索法。关于二分搜索法,我有一篇文章介绍的很详细Leetcode 二分法问题总结(超详细!!!),大家可以看看。对于这个问题我们实际上要找的是所有平方数小于x里面最大的那个。

class Solution:
    def mySqrt(self, x: int) -> int:
        l, r = 0, x
        while l < r:
            mid = (l + r + 1) >> 1
            if mid**2 <= x:
                l = mid
            else:
                r = mid - 1
        return l

其实,这个问题在数学上已经有很明确的解法了,就是大名鼎鼎的牛顿法。

首先,选择一个接近函数 f ( x ) f(x) f(x)零点的 x 0 x_0 x0,计算相应的 f ( x 0 ) f(x_0) f(x0)和切线斜率 f ′ ( x 0 ) f^{&#x27;}(x_0) f(x0)(这里 f ′ f^{&#x27;} f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值