V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hakunamatata11
V2EX  ›  推广

九章算法 | Facebook 面试题:对 x 开根 II

  •  
  •   hakunamatata11 · 2020-07-14 19:33:51 +08:00 · 740 次点击
    这是一个创建于 1597 天前的主题,其中的信息可能已经有所发展或是发生改变。

    实现 double sqrt(double x) 并且 x >= 0

    计算并返回 x 开根后的值。

    在线评测地址:LintCode 领扣

    例 1:

    输入: n = 2 
    输出: 1.41421356
    

    例 2:

    输入: n = 3
    输出: 1.73205081
    

    [题解]

    算法:二分

    此题有两种做法,一种是牛顿迭代法,一种是二分,这里介绍二分法

    • 二分浮点数与寻常二分不同的是while中变成了whlie(left+eps<right)
    • 注意小数情况,若x<1将右边界扩大到1可避免结果错误(比如0.04=0.2*0.2)如果我们不将x右边界扩大到1,则无法在[0,0.04]的区间范围内找到正解

    复杂度分析

    • 时间复杂度O(log(x))

    • 二分的复杂度

    • 空间复杂度O(1)

    • 无需额外空间

    public class Solution {
        /**
         * @param x: a double
         * @return: the square root of x
         */
        public double sqrt(double x) {
            double left = 0,right = x,mid;
            if (right < 1) {
                right = 1;
            }
            while (left + 1e-12 < right) {
                mid = left + (right - left) / 2;
                if (mid * mid < x) {
                    left = mid;
                }
                else{
                    right = mid;
                }
            }
            return left;
        }
    }
    

    更多题解参见:九章算法

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 14:38 · PVG 22:38 · LAX 06:38 · JFK 09:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.