• Leetcode-二分


    69. x的平方根 https://leetcode-cn.com/problems/sqrtx/

    实现 int sqrt(int x) 函数。

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

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

    解:

    二分,不断枚举可能的结果,判断其平方和x的关系。这题二分的过程中考虑直接用浮点型来处理,比用整型处理更通用。

    class Solution:
        def mySqrt(self, x: int) -> int:
            if x <= 1:
                return x
            
            low, high = 0., float(x)
            while abs(high - low) > 1e-5:
                mid = (high + low)/2
                y = mid*mid
                
                if y == float(x):
                    return int(mid)
                elif y < float(x):
                    low = mid  # 因为是浮点型,直接mid赋给low就行
                else:
                    high = mid
            return int(high)
    

      

    牛顿迭代法,以直线代替曲线,用一阶泰勒展式(即在当前点的切线)代替原曲线,求直线与 轴的交点,重复这个过程直到收敛。

    如果要求2的平方根,令f(x)=x2 -2,如下图。

    from https://leetcode-cn.com/problems/sqrtx/solution/niu-dun-die-dai-fa-by-loafer/

    如何通俗易懂地讲解牛顿迭代法求开方?数值分析? - 马同学的回答 - 知乎 https://www.zhihu.com/question/20690553/answer/146104283

    所以要求给定的 X 的平方根,xn+1 = xn -  (xn2 - X) / 2x,迭代到满足逼近精度即可。考虑到这题要求向下取整。

    class Solution:
        def mySqrt(self, x: int) -> int:
            if x <= 1:
                return x
            cur = x  
            while True:
                pre = cur
                cur = (cur + x / cur) / 2
                if abs(cur - pre) < 1e-5:
                    return int(cur)
    

     

     367. 有效的完全平方数 https://leetcode-cn.com/problems/valid-perfect-square/

    给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。

    说明:不要使用任何内置的库函数,如  sqrt。

    解:

    先按浮点型计算一下给定数的平方根,再取整后平方一下和num比较,相等的话即为完全平方数。

    class Solution:
        def isPerfectSquare(self, num: int) -> bool:
            if num <= 1:
                return True
            low, high = 0., float(num)
            while abs(high - low) > 1e-5:
                mid = (high + low)/2
                y = mid*mid
                
                if y == float(num):
                    return True
                elif y < float(num):
                    low = mid 
                else:
                    high = mid
                    
            return True if int(high) ** 2 == num else False
    
    class Solution:
        def isPerfectSquare(self, num: int) -> bool:
            if num <= 1:
                return True
            cur = num
            while True:
                pre = cur
                cur = (cur +  num/cur) /2
                if abs(cur-pre) < 1e-5:
                    return True if int(cur) ** 2 == num else False
    

      

    直接按整数二分,找不到整数平方根就不是完全平方数。

    class Solution:
        def isPerfectSquare(self, num: int) -> bool:
            if num <= 1:
                return True
            low, high = 0, num
            while low <= high:
                mid = low + (high - low)//2
                y = mid ** 2
                if y < num:
                    low = mid + 1
                elif y > num:
                    high = mid - 1
                else:
                    return True
            return False
    

      

  • 相关阅读:
    上周热点回顾(2.72.13)
    【故障公告】数据库服务器 CPU 100% 引发全站故障
    【故障公告】周五下午的一次突发故障
    上周热点回顾(1.171.23)
    【故障公告】k8s 开船记:增加控制舱(controlplane)造成的翻船
    [转]Flag an issue Atlassian Support / Jira Software / Resources
    [转]Create a Subtask and Link to Parent Issue in Jira
    [书目]Python数据分析实战
    jenkins
    [转]Jira ScriptRunner 插件使用总结
  • 原文地址:https://www.cnblogs.com/chaojunwang-ml/p/11364760.html
Copyright © 2020-2023  润新知