LeetCode 69. x的平方根

1|0写在前面

  • 难度:简单

  • 原文:https://leetcode-cn.com/problems/sqrtx

  • 题目

     实现 int sqrt(int x) 函数。
     
     计算并返回 x 的平方根,其中 x 是非负整数。
     
     由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
     
     示例 1:
     
     输入: 4
     输出: 2
     示例 2:
     
     输入: 8
     输出: 2
     说明: 8 的平方根是 2.82842...,
         由于返回类型是整数,小数部分将被舍去。

2|0思路

 算是暴力破解
 如果是0或1就不用理会了,直接返回x
 如果超过1,我们就拿x除以1..(X//2+1),因为一个数的平方根不可能超过X//2
 如果一个x//i<=i,我们就找到这个边界值了。但是如果是=,返回的就是i,如果是<那么返回的是i-1
 以4为例,4//2==2,返回的就是2
 以5为例,5//3<3,返回的是2
 

 

3|0参考代码

 class Solution:
     def mySqrt(self, x: int) -> int:
         if x == 0 or x==1: return x
         for i in range(1,x//2+1):#4只要计算到3,5计算到3(一半取整+1),7计算到4
             result = i
             if x//i<i: #
                 result = i-1 #如果7//3=2..1,2比3小,就把
                 break
             elif x//i==i:
                 result = i
                 break
         return result

4|0官方解释

  • 袖珍计算器

     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
     

     

  • 二分查找

     class Solution:
         def mySqrt(self, x: int) -> int:
             l, r, ans = 0, x, -1
             while l <= r:
                 mid = (l + r) // 2
                 if mid * mid <= x:
                     ans = mid
                     l = mid + 1
                 else:
                     r = mid - 1
             return ans
     
  • 牛顿迭代

    这个问题其实就是求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.

    用代码表示则为num = (num + x / num) / 2.

     class Solution:
         def mySqrt(self, x: int) -> int:
             if x == 0:
                 return 0
             
             C, x0 = float(x), float(x)
             while True:
                 xi = 0.5 * (x0 + C / x0)
                 if abs(x0 - xi) < 1e-7:
                     break
                 x0 = xi
             
             return int(x0)
     class Solution(object):
         def mySqrt(self, x):
         """
        :type x: int
        :rtype: int
        """
             num = x
             while num * num > x:
                 num = (num + x / num) / 2
                 return num
  •  

__EOF__

本文作者博客已废弃
本文链接https://www.cnblogs.com/wuxianfeng023/p/16598462.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   博客已废弃  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示