1-今日一扣-69-easy-二分法、牛顿法-sqrt实现

实现开方

leetcode

实现 int sqrt(int x) 函数。

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

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

Example 1:

Input: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842…, and since
the decimal part is truncated, 2 is returned.

解答

暴力法

无脑迭代,略。

二分法查找-常规

class Solution {
    public int mySqrt(int x) {
        int left = 0; //从0开始
        int right = x; //到x结束
        int ans = -1; //初始化为-1,不会影响正常结果

        while(left <= right ) {
            //注意二分法终止条件是left > right
            int mid = (left + right)/2;         
            if((long)mid *mid >x){ //在left ... mid-1之间 
                right = mid -1;
            }else{// 在mid+1...right之间
                left = mid + 1;
                ans = mid; //记录偏左侧答案。
            }
        }
        return ans;
    }
}

注意:

  • 循环的终止条件 left<=right
  • 两个整形相乘,可能越界,结果要用long存储
  • ans记录答案,取左侧的方法。
  • 时间复杂度 O ( log ⁡ x ) O(\log x) O(logx),查找的次数。
  • 空间复杂度O(1)

牛顿法

牛顿法是一种通过迭代快速寻找函数零点的方法。
假设该题的函数为

y ( x ) = x 2 − C y(x) = x^2 -C y(x)=x2C
就变成了寻找函数y的零点问题。
具体理论解释转到官网解析

class Solution {
    public int mySqrt(int x) {
        if (x == 0) {
            return 0;
        }

        double C = x, x0 = x; //构造y(x) = x^2 - c
        while (true) {
            double xi = 0.5 * (x0 + C / x0); //下一个x的位置。
            if (Math.abs(x0 - xi) < 1e-7) { //是否符合误差范围
                break;
            }
            x0 = xi; //迭代
        }
        return (int)x0; //转成整数。
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
来源:力扣(LeetCode)

注:

  • 空间复杂度O(1),时间复杂度 O ( log ⁡ x ) O(\log x) O(logx), 二次收敛,快于二分法。
  • 选择C = X确保正的0点在左侧。不会取到负的
  • 迭代结束条件是一个极小的非负数,通常取 1 0 − 6 10^{-6} 106 1 0 − 7 10^{-7} 107

例如求 2 \sqrt 2 2 的近似解。使用牛顿法可以从2开始猜。精确的位数可以由误差来控制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值